Skip to content

Instantly share code, notes, and snippets.

@atifaziz
Last active April 23, 2026 14:35
Show Gist options
  • Select an option

  • Save atifaziz/1eb4bc27f9171bf536badc2da4178242 to your computer and use it in GitHub Desktop.

Select an option

Save atifaziz/1eb4bc27f9171bf536badc2da4178242 to your computer and use it in GitHub Desktop.
File-based C# application using docopt.net for CLI parsing
#:package docopt.net@0.8.3
#nullable enable
using DocoptNet;
static int Main(ProgramArguments args)
{
Console.WriteLine("Parsed arguments:");
foreach (var (name, value) in args)
Console.WriteLine($" {name} = {value}");
Console.WriteLine();
Console.WriteLine($$"""
{{nameof(ProgramArguments)}}:
{
Ship = {{args.CmdShip }},
New = {{args.CmdNew }},
Name = [{{string.Join(", ", args.ArgName)}}],
Move = {{args.CmdMove }},
X = {{args.ArgX }},
Y = {{args.ArgY }},
Speed = {{args.OptSpeed }},
Shoot = {{args.CmdShoot }},
Mine = {{args.CmdMine }},
Set = {{args.CmdSet }},
Remove = {{args.CmdRemove }},
Moored = {{args.OptMoored }},
Drifting = {{args.OptDrifting}},
Help = {{args.OptHelp }},
Version = {{args.OptVersion }},
}
""");
return 0;
}
return ProgramArguments.CreateParser()
.WithVersion("Naval Fate 2.0")
.Parse(args)
.Match(Main,
result => ShowHelp(result.Help),
result => ShowVersion(result.Version),
result => OnError(result.Usage));
static int ShowHelp(string help)
{
var bin = Path.GetFileName(AppContext.GetData("EntryPointFilePath")?.ToString() // file-based app
?? Environment.ProcessPath // published app
?? ProgramArguments.Bin);
Console.WriteLine(help.Replace(ProgramArguments.Bin, bin).ReplaceLineEndings());
return 0;
}
static int ShowVersion(string version) { Console.WriteLine(version); return 0; }
static int OnError(string usage) { Console.Error.WriteLine(usage.ReplaceLineEndings()); return 1; }
[DocoptArguments]
partial class ProgramArguments
{
public const string Bin = "BIN";
const string Help = $"""
Naval Fate.
Usage:
{Bin} ship new <name>...
{Bin} ship <name> move <x> <y> [--speed=<kn>]
{Bin} ship shoot <x> <y>
{Bin} mine (set|remove) <x> <y> [--moored | --drifting]
{Bin} (-h | --help)
{Bin} --version
Options:
-h --help Show this screen.
--version Show version.
--speed=<kn> Speed in knots [default: 10].
--moored Moored (anchored) mine.
--drifting Drifting mine.
""";
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment