internal static void Run(this CommandAction commandAction, ICommandDependencyResolver resolver, CommandLineParseResult parseResult) { var instance = resolver.Resolve(commandAction.LinkedToMethod.DeclaringType); object[] parameterValues = GetCommandParameterValues(commandAction.Parameters, parseResult); commandAction.LinkedToMethod.Invoke(instance, parameterValues); }
internal static RunResult Run(this CommandAction commandAction, ICommandDependencyResolver resolver, CommandLineParseResult parseResult) { var instance = resolver.Resolve(commandAction.LinkedToMethod.DeclaringType); object[] parameterValues = GetCommandParameterValues(commandAction.Parameters, parseResult); var returnResult = new RunResult() { ReturnType = commandAction.LinkedToMethod.ReturnType }; if (commandAction.LinkedToMethod.ReturnType != typeof(void)) { var res = commandAction.LinkedToMethod.Invoke(instance, parameterValues); returnResult.Json = JsonConvert.SerializeObject( res, new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() }); } else { commandAction.LinkedToMethod.Invoke(instance, parameterValues); } return(returnResult); }
internal static async Task <RunResult> RunAsync(this CommandAction commandAction, ICommandDependencyResolver resolver, CommandLineParseResult parseResult) { var instance = resolver.Resolve(commandAction.LinkedToMethod.DeclaringType); object[] parameterValues = GetCommandParameterValues(commandAction.Parameters, parseResult); var returnResult = new RunResult() { ReturnType = commandAction.LinkedToMethod.ReturnType }; if (commandAction.LinkedToMethod.ReturnType != typeof(void)) { object res = null; if (commandAction.LinkedToMethod.IsAsyncMethod()) { dynamic result = (Task)commandAction.LinkedToMethod.Invoke(instance, parameterValues); await result; try { res = result.Result; } catch (Exception e) { res = null; } } else { res = commandAction.LinkedToMethod.Invoke(instance, parameterValues); } returnResult.Value = res; /* * returnResult.Json = JsonConvert.SerializeObject( * * res, * new JsonSerializerSettings * { * ContractResolver = new CamelCasePropertyNamesContractResolver() * }); */ } else { commandAction.LinkedToMethod.Invoke(instance, parameterValues); } return(returnResult); }
private static object[] GetCommandParameterValues(IEnumerable <ParameterInfoWrapper> parameters, CommandLineParseResult parseResult) { var args = new List <object>(); foreach (var parameter in parameters) { var parameterName = parameter.Name; CommandLineParameter commandLineParameter = parseResult.ParsedParameters.FirstOrDefault(p => p.Name.SimilarTo(parameterName)); object value = null; // Method has parameter which was not supplied. if (commandLineParameter == null || commandLineParameter.Value == null) { if (parameter.DefaultValue != null) { value = parameter.DefaultValue; } else if (parameter.IsRequired) { throw new CommandParameterInvalidException(String.Format("The parameter '{0}' is required.", parameter.Name)); } } else { value = commandLineParameter.Value; } if (value != null) { args.Add(GetConvertedParameterValue(parameter, value)); continue; } args.Add(null); } return(args.ToArray()); }
private static object[] GetCommandParameterValues(IEnumerable<ParameterInfoWrapper> parameters, CommandLineParseResult parseResult) { var args = new List<object>(); foreach (var parameter in parameters) { var parameterName = parameter.Name; CommandLineParameter commandLineParameter = parseResult.ParsedParameters.FirstOrDefault(p => p.Name.SimilarTo(parameterName)); object value = null; // Method has parameter which was not supplied. if (commandLineParameter == null || commandLineParameter.Value == null) { if (parameter.DefaultValue != null) { value = parameter.DefaultValue; } else if(parameter.IsRequired) { throw new CommandParameterInvalidException(String.Format("The parameter '{0}' is required.", parameter.Name)); } } else { value = commandLineParameter.Value; } if (value != null) { args.Add(GetConvertedParameterValue(parameter, value)); continue; } args.Add(null); } return args.ToArray(); }
public RunResult Run(string[] args) { if (args == null) { args = new string[0]; } Queue <string> arguments = new Queue <string>(args); if (_optionSet != null) { arguments = new Queue <string>(_optionSet.Parse(args)); } try { if (CommandRecords.Count == 0) { throw new NoCommandsDefinedException(); } if (arguments.Count == 0) { _helpGenerator.ShowCommandUsage(_availableCommands, _optionSet); return(new RunResult()); } var commandName = arguments.Dequeue(); var commandSelector = new CommandSelector(); var command = commandSelector.Select(commandName, CommandRecords); EnsureCommandActions(command); var actionName = arguments.Count > 0 ? arguments.Dequeue() : null; var availableActions = command.CommandActions; if (actionName == null) { _helpGenerator.ShowCommandHelp(command.Command, availableActions.ToList()); return(new RunResult()); } var actionSelector = new ActionSelector(); var action = actionSelector.Select(actionName, command.Command, availableActions); var parser = new CommandLineParser(); CommandLineParseResult parseResult = parser.Parse(action, arguments.ToArray()); return(parseResult.CommandAction.Run(_resolver, parseResult)); } catch (CommandParseExceptionBase exception) { exception.Render(); } catch (TargetInvocationException exception) { Exception innerException = exception.InnerException; if (innerException == null) { throw; } if (innerException is CommandParseExceptionBase) { ((CommandParseExceptionBase)exception.InnerException).Render(); return(new RunResult()); } throw new CommandInvocationException("Error executing command", innerException); } return(new RunResult()); }
public async Task <RunResult> RunViaRouteAsync(RouteQuery routeQuery) { try { if (CommandRecords.Count == 0) { throw new NoCommandsDefinedException(); } string route = routeQuery.Route; string method = routeQuery.Method; method = method.ToUpper(); route = route.ToLower(); var query = from item in CommandActionRecords where item.Route == route && item.CommandAction.Method == method select item; var actionRecord = query.FirstOrDefault(); if (actionRecord == null) { return(new RunResult() { ErrorCode = 404 }); } var action = actionRecord.CommandAction; var parser = new CommandLineParser(); var clp = new List <CommandLineParameter> { new CommandLineParameter("body", routeQuery.Body) }; CommandLineParseResult parseResult = new CommandLineParseResult(action, clp, new List <string>().ToArray()); return(await parseResult.CommandAction.RunAsync(_resolver, parseResult)); } catch (CommandParseExceptionBase exception) { exception.Render(); } catch (TargetInvocationException exception) { Exception innerException = exception.InnerException; if (innerException == null) { throw; } if (innerException is CommandParseExceptionBase) { ((CommandParseExceptionBase)exception.InnerException).Render(); return(new RunResult()); } throw new CommandInvocationException("Error executing command", innerException); } return(new RunResult() { ErrorCode = 404 }); }