/* * Copyright (c) 2015 Dr. Masroor Ehsan * * This file is part of OpenAlpr.Net. * * OpenAlpr.Net is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License * version 3 as published by the Free Software Foundation * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ using System; using System.Collections.Generic; using System.Linq; using System.Text.RegularExpressions; namespace openalprnet_cli { internal static class CommandLine { private const string NameGroup = "name"; // Names of capture groups private const string ValueGroup = "value"; /* The regex that extracts names and comma-separated values for switches in the form ([="value 1",value2,...])+ */ private static readonly Regex RexPattern = new Regex(@"(?[^=]+)=?((?\""?)(?(?(quoted)[^\""]+|[^,]+))\""?,?)*", RegexOptions.Compiled | RegexOptions.CultureInvariant | RegexOptions.ExplicitCapture | RegexOptions.IgnoreCase); public static void Process(this string[] args, Action printUsage, params Switch[] switches) { /* Run through all matches in the argument list and if any of the switches match, get the values and invoke the handler we were given. We do a Sum() here for 2 reasons; a) To actually run the handlers and b) see if any were invoked at all (each returns 1 if invoked). If none were invoked, we simply invoke the printUsage handler. */ if ((from arg in args from Match match in RexPattern.Matches(arg) from s in switches where match.Success && ((string.Compare(match.Groups[NameGroup].Value, s.Name, true) == 0) || (string.Compare(match.Groups[NameGroup].Value, s.ShortForm, true) == 0)) select s.InvokeHandler(match.Groups[ValueGroup].Value.Split(','))).Sum() == 0) printUsage(); // We didn't find any switches } public class Switch // Class that encapsulates switch data. { public Switch(string name, Action> handler, string shortForm) { Name = name; Handler = handler; ShortForm = shortForm; } public Switch(string name, Action> handler) { Name = name; Handler = handler; ShortForm = null; } public string Name { get; private set; } public string ShortForm { get; private set; } public Action> Handler { get; private set; } public int InvokeHandler(string[] values) { Handler(values); return 1; } } } }