CSharp · Console
// @nuget: CommandLineParser -Version 2.6.0
using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using CommandLine;
public class Program
{
public static void Main()
{
int runcount=1;
foreach(var args in new List<string[]> {
//experiment with different command line values here
new string[] { "--help" }
,new string[] { "clone", "--help" }
,new string[] { "clone", "git://github.com/commandlineparser/commandline.git" }
,new string[] { "add","--help" }
,new string[] { "add", "addfile.cs" }
,new string[] { "commit", "-m", "initial commit" }
,new string[] { "push", "-f" }
,new string[] { "push", "--force" }
,new string[] { "push" }
}) {
Console.WriteLine("** RUN #{0}. Args: {1}", runcount++, String.Join(" ", args));
__YourMain(args);
Console.WriteLine("");
}
}
//using default parser
static int __YourMain(string[] args)
{
int exitcode;
exitcode = CommandLine.Parser.Default
.ParseArguments<CommitOptions,CloneOptions>(args)
.MapResult(
(CommitOptions opts) => RunCommitCommand(opts),
(CloneOptions opts) => RunCloneCommand(opts),
//(AddOptions opts) => RunAddCommand(opts),
(parserErrors) => 1
);
return exitcode;
}
//using custom parser
static int __YourMain2(string[] args)
{
int exitcode;
TextWriter helpWriter= new StringWriter();
var parser = new Parser (config=>{
config.HelpWriter=helpWriter;
});
exitcode = CommandLine.Parser.Default
.ParseArguments<CommitOptions,CloneOptions>(args)
.MapResult(
(CommitOptions opts) => RunCommitCommand(opts),
(CloneOptions opts) => RunCloneCommand(opts),
//(AddOptions opts) => RunAddCommand(opts),
(parserErrors) => DisplayHelp(parserErrors,helpWriter)
);
return exitcode;
}
static int DisplayHelp (IEnumerable<Error> errs, TextWriter helpWriter) {
//if (errs.IsVersion () || errs.IsHelp ())
Console.WriteLine (helpWriter.ToString ());
//else
// Console.Error.WriteLine (helpWriter.ToString ());
return 1;
}
static int RunCommitCommand(CommitOptions CommitOptions)
{
WriteProgramOptions(CommitOptions);
Console.WriteLine("commit message: '{0}'", CommitOptions.Message);
Console.WriteLine("commit amend: {0}", CommitOptions.Amend);
if(string.IsNullOrEmpty(CommitOptions.Message)==true) {
Console.WriteLine("Aborting commit due to empty commit message.");
return 1;
}
Console.WriteLine();
return 0;
}
static int RunCloneCommand(CloneOptions CloneOptions)
{
WriteProgramOptions(CloneOptions);
if(string.IsNullOrEmpty(CloneOptions.DestinationDirectory))
{
System.Uri Uri;
if(System.Uri.TryCreate(CloneOptions.Source, UriKind.Absolute, out Uri))
{
CloneOptions.DestinationDirectory = Uri.Segments.Last().TrimStart('/').Replace(".git","");
}
}
Console.WriteLine("clone source: {0}", CloneOptions.Source);
Console.WriteLine("clone destination: {0}", String.Join(" ", CloneOptions.DestinationDirectory));
return 0;
}
static void WriteProgramOptions(ProgramOptions ProgramOptions)
{
Console.WriteLine("ProgramOptions type: {0}", ProgramOptions.GetType().Name);
Console.WriteLine("Verbose: {0}", ProgramOptions.Verbose);
Console.WriteLine("Porcelain: {0}", ProgramOptions.Porcelain);
}
}
public abstract class ProgramOptions
{
[Option("verbose")]
public bool Verbose { get; set; }
[Option("porcelain", HelpText="use output that can be parsed")]
public bool Porcelain { get; set; }
}
[Verb("commit")]
public class CommitOptions : ProgramOptions
{
[Value(0)]
public IEnumerable<string> InputFiles { get; set; }
[Option('m',"message")]
public string Message { get; set; }
[Option("amend")]
public string Amend { get; set; }
}
[Verb("clone")]
public class CloneOptions : ProgramOptions
{
[Value(0)]
public string Source { get; set; }
[Value(1)]
public string DestinationDirectory { get; set; }
}