commandlineutil/Lib/VerbMap.cs (50 lines of code) (raw):

/* * Copyright (c) 2017 Google Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ using CommandLine; using System; using System.Collections.Generic; using System.Linq; namespace GoogleCloudSamples { /// <summary> /// A fluent interface to CommandLineParser library that can handle more /// 16 verbs. /// /// <param name="ResultType">The return type of your verb delegates. /// Usually an int. /// </param> /// </summary> public class VerbMap<ResultType> { protected readonly Dictionary<Type, Func<object, ResultType>> _verbs = new Dictionary<Type, Func<object, ResultType>>(); /// <summary> /// When an Action (with no return value) is invoked by Run(), this /// value will be returned. /// </summary> public ResultType DefaultResult { get; set; } /// <summary> /// Invoked when the command line arguments failed to parse. /// </summary> public Func<NotParsed<object>, ResultType> NotParsedFunc { get; set; } /// <summary> /// Map an OptionsType to its handler function. /// </summary> public VerbMap<ResultType> Add<OptionsType>(Func<OptionsType, ResultType> f) { _verbs.Add(typeof(OptionsType), (object a) => f((OptionsType)a)); return this; } /// <summary> /// Map an OptionsType to its handler action. /// </summary> public VerbMap<ResultType> Add<ArgType>(Action<ArgType> f) { _verbs.Add(typeof(ArgType), (object a) => { f((ArgType)a); return DefaultResult; }); return this; } /// <summary> /// A fluent way to set NotParseFunc. /// </summary> public VerbMap<ResultType> SetNotParsedFunc(Func<NotParsed<object>, ResultType> func) { NotParsedFunc = func; return this; } /// <summary> /// Invoke a verb based on the arguments. /// </summary> public ResultType Run(string[] args, Parser parser = null) { parser = parser ?? Parser.Default; ParserResult<object> result = parser.ParseArguments(args, _verbs.Keys.ToArray()); var parsed = result as Parsed<object>; if (parsed != null) { return _verbs[parsed.Value.GetType()](parsed.Value); } if (NotParsedFunc == null) { return DefaultResult; } return NotParsedFunc((NotParsed<object>)result); } } }