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);
        }
Exemple #2
0
        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);
        }
Exemple #3
0
        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);
        }
Exemple #4
0
        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
            });
        }
        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);
        }