using System.Collections.Generic;
namespace SharpExtension {
public static Option<T> Create(T value) { return new Option<T>(value); }
public static Option<T> CreateEmpty() { return new Option<T>(); }
public bool IsNone() { return (this.GetValue() == null || EqualityComparer<T>.Default.Equals(this.GetValue(), default(T))); }
public T GetValue() { return m_Value; }
public void Match(Action<T> hasValueDelegate, Action hasNoneDelegate) { if (this.IsNone()) { hasNoneDelegate(); } else { hasValueDelegate(this.GetValue()); } }
public T UnwrapOrThrow(string msg) { if (this.IsNone()) { throw new Exception(msg); } else return this.GetValue(); }
private Option(T value) { m_Value = value; }
private readonly T m_Value;
public ArgParser(string program, string description) {
m_Description = description;
m_Arguments = new Dictionary<string, Argument>();
AddArgument("-h", "Display help", false, (parameters) => { DisplayHelp(); });
public void AddArgument(string option, string description, bool hasParams, Action<string[]> OnArgumentFound) {
if (m_Arguments.ContainsKey(option)) { return; }
m_Arguments.Add(option, new Argument() { Arg = option, Description = description, HasParameters = hasParams, OnArgumentFound = OnArgumentFound });
var args = System.Environment.GetCommandLineArgs();
for (int i=0; i< args.Length; i++) {
if (!m_Arguments.ContainsKey(args[i])) { Console.WriteLine("Error: Unknown command \"{0}\" specified!\n\n", args[i]);DisplayHelp(); System.Environment.Exit(0); }
Argument arg = m_Arguments.GetValueOrDefault(args[i]);
arg.OnArgumentFound(args[++i].Split(','));
arg.OnArgumentFound(null);
public void DisplayHelp() {
Console.WriteLine("Help for program {0}\n\n{1}\n", m_Program, m_Description);
Console.WriteLine("Following commands are possible:");
foreach (var arg in m_Arguments) {
var argument = arg.Value;
Console.WriteLine("\t{0} : {1}", option, argument.Description);
private Dictionary<string, Argument> m_Arguments;
private readonly string m_Program;
private readonly string m_Description;
private struct Argument {
public string Description;
public bool HasParameters;
public string[] Parameters;
public Action<string[]> OnArgumentFound;