Exemple #1
0
 private static void ResolveNameOfUnnamedParams(IParsedParam param, ParameterDefinition def)
 {
     //add name to unnamed params
     if (param is ComplexParam cp)
     {
         for (int i = 0; i < cp.SubParams.Length && i < def.SubParams.Length; i++)
         {
             var subParam = cp.SubParams[i];
             var subDef   = def.SubParams.OrderBy(f => f.Options.Order).ToArray()[i];
             if (subDef.Type.IsBuiltIn(true) || subDef.Type.IsEnumerable())
             {
                 if (String.IsNullOrWhiteSpace(subParam.Name))
                 {
                     subParam.Name = subDef.Name;
                 }
             }
             else
             {
                 ResolveNameOfUnnamedParams(subParam, subDef);
             }
         }
     }
     else if (param is ArrayParam ap)
     {
         var subDef = def.SubParams.OrderBy(f => f.Options.Order).ToArray()[0];
         if (String.IsNullOrWhiteSpace(param.Name))
         {
             param.Name = subDef.Name;
         }
     }
 }
Exemple #2
0
        public void GetHelp(Type type, IParsedParam parsedParam)
        {
            this.Initialize(type);

            string helpParam = ((SimpleParam)parsedParam)?.Value;

            var cmdDefs = DefinitionHelper.GetCommandDefinitions(type);

            cmdDefs.OrderBy(cDef => cDef.Name).ToList();

            if (String.IsNullOrEmpty(helpParam))
            {
                string indentation = new string( ' ', 2 );
                Console.WriteLine();

                Console.WriteLine($"{indentation}AVAILABLE COMMANDS:");
                Console.WriteLine();

                Console.WriteLine($"{indentation}{indentation}{"COMMAND",-20}{"DESCRIPTION"}");
                Console.WriteLine();

                foreach (var cmdDef in cmdDefs)
                {
                    Console.WriteLine($"{indentation}{indentation}{cmdDef.Name.ToLower(),-20}{cmdDef.Options.HelpText}");
                }

                Console.WriteLine();
                Console.WriteLine($"{indentation}To invoke a command, type --<command>");
                Console.WriteLine($"{indentation}For more info about a specific command, type --help <command>");
                //Console.WriteLine( $"{indentation}Collection parameters must be surrounded by []" );
                //Console.WriteLine( $"{indentation}Non primitives types must be surrounded by ()" );
                Console.WriteLine();
            }

            //else if( !(helpCmd.Param is SimpleParam) )
            //{
            //    Console.WriteLine( "--help accepts only one input argument" );

            //    //if( this.ShowHelpOnError )
            //    //    this.Parse<T>( $"--{HelpCommandDefinition.Name.ToLower()} {HelpCommandDefinition.Name.ToLower()}" );
            //    //else
            //    //    Console.WriteLine();
            //}
            else
            {
                var cmdUsage = cmdDefs.FirstOrDefault(cmd => cmd.Name.ToLower() == helpParam.ToLower());
                if (cmdUsage == null)
                {
                    Console.WriteLine($"A command named '{helpParam}' does not exist");

                    //if( this.ShowHelpOnError )
                    //    this.Parse<T>( $"--{HelpCommandDefinition.Name.ToLower()}" );
                    //else
                    //    Console.WriteLine();
                }
                else
                {
                    string indentation = new string( ' ', 2 );

                    Console.WriteLine();
                    Console.WriteLine($"{indentation}COMMAND '{cmdUsage.Name.ToUpper()}'");

                    if (!String.IsNullOrWhiteSpace(cmdUsage.Options.HelpText))
                    {
                        Console.WriteLine($"{indentation}{indentation}{cmdUsage.Options.HelpText}");
                    }

                    Console.WriteLine();
                    Console.WriteLine($"{indentation}USAGE:");

                    var parameters = cmdUsage.SubParams.Select(p => p.Options.IsRequired ? p.Name.ToLower() : $"[{p.Name.ToLower()}]");
                    Console.WriteLine($"{indentation}{indentation}--{cmdUsage.Name.ToLower() } {String.Join( " ", parameters )}");

                    if (cmdUsage.SubParams.Length > 0)
                    {
                        Console.WriteLine();
                        Console.WriteLine($"{indentation}PARAMETERS DETAILS:");
                        Console.WriteLine();

                        int namePadRight     = Math.Max(cmdUsage.SubParams.Max(p => p.Name.Length), "NAME".Length) + 3;
                        int typePadRight     = Math.Max(cmdUsage.SubParams.Max(p => p.Type.GetPrettifiedName().Length), "TYPE".Length) + 3;
                        int requiredPadRight = "REQUIRED".Length + 3;

                        Console.WriteLine($"{indentation}{indentation}{"NAME".PadRight( namePadRight )}{"TYPE".PadRight( typePadRight )}{"REQUIRED".PadRight( requiredPadRight )}DESCRIPTION");
                        foreach (var param in cmdUsage.SubParams)
                        {
                            string required    = param.Options.IsRequired ? "Yes" : "No";
                            string description = param.Options.HelpText ?? "<No description provided>";

                            Console.WriteLine($"{indentation}{indentation}{param.Name.PadRight( namePadRight )}{param.Type.GetPrettifiedName().PadRight( typePadRight )}{required.PadRight( requiredPadRight )}{description}");
                        }
                    }
                    Console.WriteLine();
                }
            }
        }
Exemple #3
0
        public IEnumerable <ParsedCommand> Parse(string commandLine)
        {
            if (String.IsNullOrWhiteSpace(commandLine))
            {
                throw new ArgumentNullException(nameof(commandLine), "Null or empty command");
            }

            var commands = commandLine.SplitKeepDelimiter(COMMAND_IDENTIFIER).ToArray();

            if (commands.Length == 0)
            {
                //try implicit notation
                {
                    var match = BalancedParenthesesRegex.Match(commandLine);
                    if (!match.Success)
                    {
                        throw new SyntaxErrorException();
                    }

                    var parsedParams = match.Groups["params"]
                                       .Captures.Cast <Capture>()
                                       .Select(c => c.Value);
                }

                throw new SyntaxErrorException();
            }

            int paramIndex = 0;

            foreach (var command in commands)
            {
                var match = CommandRegex.Match(command);
                if (!match.Success)
                {
                    throw new SyntaxErrorException();
                }

                var cmdName = match.Groups["command"].Value;

                var parsedParams = match.Groups["params"]
                                   .Captures.Cast <Capture>()
                                   .Select(c => c.Value);

                var parameters = GetCommandParams(parsedParams).ToList();

                IParsedParam theparam = null;
                if (parameters.Count > 1)
                {
                    theparam = new ComplexParam()
                    {
                        //Name = cmdName,
                        Index     = paramIndex,
                        SubParams = parameters.ToArray()
                    };
                }
                else
                {
                    var p = parameters.FirstOrDefault();

                    if (p == null)
                    {
                        theparam = null;
                    }
                    else
                    {
                        p.Index  = paramIndex;
                        theparam = p;
                    }
                }

                yield return(new ParsedCommand()
                {
                    Name = cmdName,
                    Param = theparam
                });

                paramIndex++;
            }
        }
Exemple #4
0
 public ArgumentNumberException(IParsedParam param)
     : base(String.Format(_errorMsg, param.Name))
 {
     this.Param = param;
 }
Exemple #5
0
        private IParsedParam InternalOptionalMethodParams(IParsedParam param, ParameterDefinition def)
        {
            if (def.MemberType != MemberTypes.METHOD)
            {
                return(param);
            }

            ResolveNameOfUnnamedParams(param, def);

            var optionalParams = def.SubParams.Where(p => !p.Options.IsRequired).ToList();

            if (optionalParams.Count == 0)
            {
                return(param);
            }

            var requiredParams = def.SubParams.Except(optionalParams);

            if (!(param is ComplexParam))
            {
                var subs = new List <IParsedParam>();


                if (param != null)
                {
                    subs.Add(param);
                }

                for (int paramIndex = 0; paramIndex < def.SubParams.Length; paramIndex++)
                {
                    var sub = def.SubParams[paramIndex];

                    if (param?.Name == sub.Name)
                    {
                        continue;
                    }

                    //if( param?.Index == sub.Options.Order )
                    //    continue;

                    if (!sub.Options.IsRequired)
                    {
                        if (sub.Type.IsBuiltIn(false))
                        {
                            subs.Add(new SimpleParam()
                            {
                                Name = sub.Name, Index = sub.Options.Order, Value = sub.DefaultValue?.ToString()
                            });
                        }
                        else if (sub.Type.IsEnumerable())
                        {
                            subs.Add(new ArrayParam()
                            {
                                Name = sub.Name, Index = sub.Options.Order
                            });
                        }
                        else
                        {
                            subs.Add(new ComplexParam()
                            {
                                Name = sub.Name, Index = sub.Options.Order
                            });
                        }
                    }
                }

                return(new ComplexParam()
                {
                    SubParams = subs.ToArray()
                });
            }
            else if (((ComplexParam)param).SubParams.Length < def.SubParams.Length)
            {
                var paramsSubs = new List <IParsedParam>();
                paramsSubs.AddRange(((ComplexParam)param).SubParams);

                for (int paramIndex = 0; paramIndex < def.SubParams.Length; paramIndex++)
                {
                    var defSub = def.SubParams[paramIndex];

                    if (paramsSubs.Any(s => s.Name == defSub.Name))
                    {
                        continue;
                    }

                    //if( paramIndex < paramsSubs.Count &&
                    //    paramsSubs[ paramIndex ].Index == defSub.Options.Order )
                    //    continue;

                    if (!defSub.Options.IsRequired)
                    {
                        if (defSub.Type.IsBuiltIn(false))
                        {
                            paramsSubs.Add(new SimpleParam()
                            {
                                Name = defSub.Name, Index = defSub.Options.Order, Value = defSub.DefaultValue?.ToString()
                            });
                        }
                        else if (defSub.Type.IsEnumerable())
                        {
                            paramsSubs.Add(new ArrayParam()
                            {
                                Name = defSub.Name, Index = defSub.Options.Order
                            });
                        }
                        else
                        {
                            paramsSubs.Add(new ComplexParam()
                            {
                                Name = defSub.Name, Index = defSub.Options.Order
                            });
                        }
                    }
                }

                return(new ComplexParam()
                {
                    SubParams = paramsSubs.ToArray()
                });
            }

            return(param);
        }
Exemple #6
0
        private IParsedParam Internal(IParsedParam param, ParameterDefinition def)
        {
            if (param == null)
            {
                return(null);
            }

            switch (param)
            {
            case ArrayParam _: return(param);

            case SimpleParam sp:

                if (def.Type?.IsBuiltIn(true) == true)
                {
                    return(sp);
                }

                return(new ComplexParam()
                {
                    Name = def.Name,
                    Index = 0,
                    SubParams = new[] { sp }
                });

            case ComplexParam cp:
            {
                var subParamsDef = def.SubParams;
                if (subParamsDef.All(s => s.Type.IsBuiltIn(true)))
                {
                    _complexParamChecks.Checks(cp, def.Type, def.SubParams);
                    return(cp);
                }

                IEnumerable <IParsedParam> getSubparams(ComplexParam localcp)
                {
                    for (int i = 0; i < localcp.SubParams.Length; i++)
                    {
                        var item = localcp.SubParams[i];

                        var defSub = def.SubParams.FirstOrDefault(k => k.Name.ToLower() == item.Name.ToLower());
                        if (defSub == null)
                        {
                            defSub = def.SubParams.FirstOrDefault(k => k.Options.Order == item.Index);
                        }

                        var newitem = Internal(item, defSub);
                        yield return(newitem);
                    }
                };

                if (def.SubParams.Length == 1)
                {
                    //nesting just to check properly
                    var temp = new ComplexParam()
                    {
                        Name      = "",
                        SubParams = new[] { cp }
                    };

                    _complexParamChecks.Checks(temp, def.Type, def.SubParams);

                    var subparams = getSubparams(temp).ToArray();
                    return(subparams.First());
                }
                else
                {
                    _complexParamChecks.Checks(cp, def.Type, def.SubParams);

                    var subparams = getSubparams(cp).ToArray();

                    return(new ComplexParam()
                        {
                            Name = def.Name,
                            Index = 0,
                            SubParams = subparams
                        });
                }
            }
            }

            throw new NotSupportedException();
        }
Exemple #7
0
 public MisplacedNamedParamException(IParsedParam param)
     : base(_errorMsg)
 {
 }