Пример #1
0
        public void InvokeCliCall(CliCall cliCall)
        {
            var commandName = $"{cliCall.ControllerName}:{cliCall.ActionName}";
            var command     = GetCommand(commandName);

            if (command == null)
            {
                Util.WriteLine($"<error>Command {commandName} is unknown</error>");
                Util.WriteLine("Call help:list to see all available commands");
                return;
            }
            var commandController = ObjectManager.Instance().Get(command.DeclaringType);
            var arguments         = MapArguments(command, cliCall);
            var request           = new CliRequest();

            request.ActionName     = cliCall.ActionName;
            request.ControllerName = cliCall.ControllerName;
            request.Arguments      = new Dictionary <string, object>();
            foreach (var parameter in command.GetParameters())
            {
                request.Arguments.Add(parameter.Name, arguments[parameter.Position]);
            }
            ((AbstractCliController)commandController).SetCliReqest(request);
            var actionName = Text.FirstCharToUpper(cliCall.ActionName) + "Command";

            command.Invoke(commandController, arguments);
        }
Пример #2
0
        protected object[] MapArguments(MethodInfo actionInfo, CliCall cliCall)
        {
            var result             = new List <object>();
            var consumedParameters = 0;

            foreach (var parameter in actionInfo.GetParameters())
            {
                var      targetName     = parameter.Name;
                object[] argumentString = null;
                object   targetValue    = null;
                if (cliCall.HasArgument(targetName))
                {
                    argumentString = cliCall.GetArgument(targetName);
                }
                else if (cliCall.HasArgument(consumedParameters))
                {
                    argumentString = new object[1] {
                        cliCall.GetArgument(consumedParameters++)
                    };
                }
                else if (parameter.IsOptional && parameter.HasDefaultValue)
                {
                    targetValue = parameter.DefaultValue;
                }
                else
                {
                    throw new System.ArgumentException($"Missing parameter {targetName}.");
                }
                if (targetValue == null)
                {
                    var typeConverter = TypeDescriptor.GetConverter(parameter.ParameterType);
                    targetValue = typeConverter.ConvertTo(argumentString[0], parameter.ParameterType);
                }
                result.Add(targetValue);
            }
            return(result.ToArray());
        }
Пример #3
0
        protected CliCall ParseCliCall(string[] args)
        {
            var cliCall = new CliCall();

            if (args.Length < 1 || args[0].IndexOf(':') < 0)
            {
                throw new System.ArgumentException("Not a valid command");
            }
            var commandParts = args[0].Split(':');

            cliCall.ControllerName = commandParts[0].ToLower();
            cliCall.ActionName     = commandParts[1].ToLower();
            var    namedArguments      = new Dictionary <string, List <string> >();
            var    positionalArguments = new List <string>();
            string currentArgument     = null;

            void addArgument(string n, string v)
            {
                if (!namedArguments.ContainsKey(n))
                {
                    namedArguments.Add(n, new List <string>());
                }
                namedArguments[n].Add(v);
            };
            for (var i = 1; i < args.Length; i++)
            {
                var arg = args[i];
                if (arg[0] == '-')
                {
                    if (currentArgument != null)
                    {
                        addArgument(currentArgument, "true");
                    }
                    if (arg[1] == '-')
                    {
                        currentArgument = arg.Substring(2);
                    }
                    else
                    {
                        for (var j = 1; j < arg.Length - 1; j++)
                        {
                            addArgument(arg[j].ToString(), "true");
                        }
                        currentArgument = arg[arg.Length - 1].ToString();
                    }
                }
                else
                {
                    if (currentArgument == null)
                    {
                        positionalArguments.Add(arg);
                    }
                    else
                    {
                        addArgument(currentArgument, arg);
                        currentArgument = null;
                    }
                }
            }
            cliCall.PositionalArguments = positionalArguments;
            cliCall.NamedArguments      = namedArguments;
            return(cliCall);
        }
Пример #4
0
        public void DescribeCommand(string commandName)
        {
            MethodInfo command = (new CliHandler()).GetCommand(commandName);

            if (command == null)
            {
                Util.WriteLine($"<error>No command {commandName} was found</error>");
                return;
            }
            var parameters = command.GetParameters();

            Util.WriteLine($"<fg=DarkGrey>defined in {command.DeclaringType.Name}</>\n");
            Util.WriteLine($"<fg=Yellow>Usage</>");
            var usageStringBuilder = new StringBuilder(commandName);

            foreach (var parameter in parameters)
            {
                if (parameter.IsOptional)
                {
                    usageStringBuilder.Append($" [{parameter.Name}]");
                }
                else
                {
                    usageStringBuilder.Append($" <{parameter.Name}>");
                }
            }
            Util.WriteLine(usageStringBuilder.ToString(), 2);
            Util.WriteLine();

            var helpText = getHelpText(command);

            if (!string.IsNullOrEmpty(helpText))
            {
                Util.WriteLine($"<fg=Yellow>Help</>");
                Util.WriteLine(getHelpText(command));
                Util.WriteLine();
            }

            if (parameters.Length > 0)
            {
                Util.WriteLine($"<fg=Yellow>Arguments</>");
                var parameterAttributes   = command.GetCustomAttributes(typeof(Parameter));
                var parameterDescriptions = new Dictionary <string, string>();
                foreach (var parameterAttribute in parameterAttributes)
                {
                    var attribute = (Parameter)parameterAttribute;
                    parameterDescriptions.Add(attribute.GetName(), attribute.Description);
                }
                foreach (var parameter in parameters)
                {
                    Util.Write($"<fg=White>--{CliCall.GetCliParameterName(parameter.Name)}</>", 2);
                    if (parameter.HasDefaultValue)
                    {
                        Util.Write($" <fg=DarkGrey>({parameter.DefaultValue.ToString()})</>", 2);
                    }
                    Util.WriteLine();
                    if (parameterDescriptions.ContainsKey(parameter.Name) && !string.IsNullOrEmpty(parameterDescriptions[parameter.Name]))
                    {
                        Util.WriteLine(parameterDescriptions[parameter.Name], 4);
                    }
                }
            }
        }