Skip to content

Instantly share code, notes, and snippets.

@atifaziz
Created December 16, 2025 08:49
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 [email protected]
#nullable enable
using DocoptNet;
static int Main(ProgramArguments args)
{
foreach (var (name, value) in args)
Console.WriteLine($"{name} = {value}");
Console.WriteLine($@"{{
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;
}
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));
return 0;
}
static int ShowVersion(string version) { Console.WriteLine(version); return 0; }
static int OnError(string usage) { Console.WriteLine(usage); return 1; }
return ProgramArguments.CreateParser()
.WithVersion("Naval Fate 2.0")
.Parse(args)
.Match(Main,
result => ShowHelp(result.Help),
result => ShowVersion(result.Version),
result => OnError(result.Usage));
[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