private static CommandLineArgument FindArgument(CommandLineDefinition definition, string argName)
        {
            var argObj = definition.FindArgument(argName);

            if (argObj == null)
            {
                throw new UnrecognisedCommandLineArgumentException();
            }
            return(argObj);
        }
        /// <summary>
        /// Generates the usage information for a given command-line argument set.
        /// </summary>
        /// <returns>The usage information for the given command-line argument set.</returns>
        public string GenerateHelpText(CommandLineDefinition definition, string applicationName, string applicationDescription)
        {
            var helpText = new StringBuilder();

            helpText.AppendLine(applicationDescription);
            helpText.AppendLine();

            helpText.Append(applicationName);
            foreach (var arg in (from a in definition where a.Required orderby a.ShortName select a))
            {
                helpText.AppendFormat(" -{0}", arg.ShortName);
                if (arg.RequiresValue)
                {
                    helpText.Append(" \"value\"");
                }
            }

            foreach (var arg in (from a in definition where !a.Required orderby a.ShortName select a))
            {
                helpText.Append(" [");
                helpText.AppendFormat("-{0}", arg.ShortName);
                if (arg.RequiresValue)
                {
                    helpText.Append(" \"value\"");
                }
                helpText.Append("]");
            }

            helpText.AppendLine();
            helpText.AppendLine();

            var longestShortName = (from arg in definition select arg.ShortName.Length).Max() * -1;
            var longestLongName  = (from arg in definition select arg.LongName.Length).Max() * -1;

            var formatString = string.Format(" {{0}} -{{1,{0}}} --{{2,{1}}}  {{3}}{{4}}", longestShortName, longestLongName);

            foreach (var arg in definition.OrderByDescending(a => a.Required).ThenBy(a => a.ShortName))
            {
                helpText.AppendFormat(formatString, arg.Required ? "R" : " ", arg.ShortName, arg.LongName, arg.Description, Environment.NewLine);
            }
            return(helpText.ToString());
        }
        /// <summary>
        /// Parses a collection of command-line parameters.
        /// </summary>
        /// <param name="definition">The definition that the command-line arguments must correspond to.</param>
        /// <param name="args">The arguments to parse.</param>
        /// <returns>The parsed argument values.</returns>
        public Dictionary <string, string> Parse(CommandLineDefinition definition, IEnumerable <string> args)
        {
            var argValues  = new Dictionary <string, string>();
            var enumerator = args.GetEnumerator();

            while (enumerator.MoveNext())
            {
                var arg = enumerator.Current;
                if (string.IsNullOrEmpty(arg))
                {
                    continue;
                }

                var argName  = ParseArgumentName(arg);
                var argObj   = FindArgument(definition, argName);
                var argValue = ParseArgumentValue(argObj, enumerator);
                argValues.Add(argObj.LongName, argValue);
            }
            EnsureRequiredArgumentsPresent(definition, argValues);
            return(argValues);
        }
 /// <summary>
 /// Parses a collection of command-line parameters.
 /// </summary>
 /// <param name="definition">The definition that the command-line arguments must correspond to.</param>
 /// <param name="args">The arguments to parse.</param>
 /// <returns>The parsed argument values.</returns>
 public object Parse(CommandLineDefinition definition, string args)
 {
     return(Parse(definition, Split(args)));
 }