internal static int RunCommand(object command, CommandMetadata metadata, string[] args) { if (metadata.Options == null) { try { return Run(command, metadata, null); } catch (ShellCommandHelpException helpException) { helpException.ParsingResult = new ParsingResult(new List<ParsingError>()); throw; } } ParsingResult parsingResult; object options = null; if (metadata.Type == metadata.Options.Type) parsingResult = CommandOptionsParser.Parse(metadata.Options, command, args); else { options = Activator.CreateInstance(metadata.Options.Type); parsingResult = CommandOptionsParser.Parse(metadata.Options, options, args); } if (!parsingResult) throw new ShellCommandHelpException(command) { ParsingResult = parsingResult }; try { return Run(command, metadata, options); } catch (ShellCommandHelpException helpException) { helpException.ParsingResult = parsingResult; throw; } }
private static int Run(object command, CommandMetadata metadata, object options) { object returnValue; try { returnValue = options == null ? metadata.RunnableMethod.Invoke(command, new object[] { }) : metadata.RunnableMethod.Invoke(command, new[] { options }); } catch (TargetInvocationException invocationError) { throw invocationError.InnerException; } return returnValue != null ? (int)returnValue : 0; }
//[GetHelp] public string GetUsage(CommandMetadata metadata, ParsingResult parsingResult) { return new StringBuilder(metadata.Name).AppendLine().AppendLine(metadata.Description) .AppendLine(string.Join(Environment.NewLine, parsingResult.Errors.Select( err => (err.OptionMetadata.IsNamedOption ? ((CommandNamedOptionMetadata)err.OptionMetadata).ShortName + ((CommandNamedOptionMetadata)err.OptionMetadata).LongName : string.Empty) + " " + err.OptionMetadata.ToString() + " - " + err.ParsingErrorBase.ToString()))).ToString(); }
private static void ShowCommandHelp(object command, CommandMetadata metadata, ParsingResult parsingResult) { // ReSharper disable PossibleNullReferenceException if (metadata.HelpMethod == null) HelpBuilder.PrintCommandHelp(Output, metadata, AssemblyInfo, parsingResult); else { var parameters = new List<object>(); foreach (var type in metadata.HelpMethod.GetParameters().Select(param => param.ParameterType)) if (type == typeof(CommandMetadata)) parameters.Add(metadata); else parameters.Add(parsingResult); Output.WriteLine(metadata.HelpMethod.Invoke(command, parameters.ToArray())); } // ReSharper restore PossibleNullReferenceException }