Exemple #1
0
        public void CheckThrowNamedParamsOrder(ComplexParam param)
        {
            int lastNamedParamIndex    = -1;
            int lastNonNamedParamIndex = -1;

            int i = 0;

            foreach (var subparam in param.SubParams)
            {
                if (String.IsNullOrWhiteSpace(subparam.Name))
                {
                    lastNonNamedParamIndex = i;
                }
                else
                {
                    lastNamedParamIndex = i;
                }

                i++;
            }

            if ((lastNamedParamIndex > -1 && lastNonNamedParamIndex > -1) &&
                lastNonNamedParamIndex > lastNamedParamIndex)
            {
                throw new MisplacedNamedParamException(param);
            }
        }
Exemple #2
0
        protected void CheckThrowParamNumber(ComplexParam param, ParameterDefinition[] paramsDef)
        {
            int requiredParams = paramsDef.Count(cmdi => cmdi.Options?.IsRequired ?? false);

            if (param.SubParams.Length < requiredParams ||
                param.SubParams.Length > paramsDef.Length)
            {
                throw new ArgumentNumberException(param);
            }
        }
Exemple #3
0
        public void Checks(ComplexParam param, Type target, ParameterDefinition[] paramsDef)
        {
            CheckThrowParameterNameCollisions(target, paramsDef);
            CheckThrowArgumentNameCollisions(param);

            CheckThrowParamNumber(param, paramsDef);
            CheckThrowNamedParamsExist(param, target, paramsDef);
            CheckThrowNamedParamsOrder(param);
            //CheckThrowParamsTypeOrder (if cp provided and sp is expected number is still ok but should throw)
        }
Exemple #4
0
        private void CheckThrowArgumentNameCollisions(ComplexParam param)
        {
            //anonymous params (empty name) are not a problem
            var groups = param.SubParams.Where(p => !String.IsNullOrEmpty(p.Name))
                         .GroupBy(p => p.Name.ToLower());

            foreach (var item in groups)
            {
                if (item.Count() > 1)
                {
                    throw new DuplicateArgumentException(item.Key);
                }
            }
        }
Exemple #5
0
        /// <summary>
        /// Check and throw if any unsupported namedparam is provided
        /// (can be a mispelling of a named param)
        /// </summary>
        protected void CheckThrowNamedParamsExist(ComplexParam param, Type target, ParameterDefinition[] paramsDef)
        {
            var longNames = paramsDef.Where(l => !String.IsNullOrWhiteSpace(l.Name))
                            .Select(l => l.Name.ToLower());

            var availableParamNames = longNames
                                      .Where(i => !String.IsNullOrWhiteSpace(i));

            var providedParams = param.SubParams.Where(l => !String.IsNullOrWhiteSpace(l.Name))
                                 .Select(p => p.Name.ToLower());

            foreach (var providedParam in providedParams)
            {
                var isCorrectParam = availableParamNames.Contains(providedParam);
                if (!isCorrectParam)
                {
                    throw new UndefinedParameterException(target, providedParam);
                }
            }
        }
Exemple #6
0
 public void ComplexParamNoReturn(ComplexParam complex)
 {
 }
Exemple #7
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 #8
0
        public void ComplexParamRecursion()
        {
            var mapper = new Mapper();

            mapper.Config.Mappers.AddBefore <ReferenceMapper>(new IMappingExpressionBuilder[]
            {
                new SimpleParamExpressionBuilder(mapper.Config),
                new ComplexParamExpressionBuilder(mapper.Config)
            });

            var complexParam = new ComplexParam()
            {
                Index     = 4,
                Name      = "asdf",
                SubParams = new IParsedParam[]
                {
                    new SimpleParam()
                    {
                        Name  = nameof(Commands.PropertyA),
                        Index = 0,
                        Value = "A"
                    },

                    new SimpleParam()
                    {
                        Name  = nameof(Commands.PropertyB),
                        Index = 1,
                        Value = "1"
                    },

                    new ComplexParam()
                    {
                        Name      = nameof(Commands.SomeCommand),
                        Index     = 2,
                        SubParams = new IParsedParam[]
                        {
                            new SimpleParam()
                            {
                                Name  = nameof(Commands.SomeCommand.A),
                                Index = 0,
                                Value = "SomeCommand.A"
                            },

                            new SimpleParam()
                            {
                                Name  = nameof(Commands.SomeCommand.B),
                                Index = 1,
                                Value = "SomeCommand.B"
                            },

                            new ComplexParam()
                            {
                                Name      = nameof(Commands.SomeCommand.SubLevel2),
                                Index     = 2,
                                SubParams = new IParsedParam[]
                                {
                                    new SimpleParam()
                                    {
                                        Name  = nameof(Commands.SomeCommand.SubLevel2.D),
                                        Index = 0,
                                        Value = "SomeCommand.SubLevel2.D"
                                    },

                                    new SimpleParam()
                                    {
                                        Name  = nameof(Commands.SomeCommand.SubLevel2.E),
                                        Index = 1,
                                        Value = "SomeCommand.SubLevel2.E"
                                    }
                                }
                            }
                        }
                    }
                }
            };

            var target = mapper.Map <Commands>(complexParam);

            Assert.IsTrue(target.PropertyA == "A");
            Assert.IsTrue(target.PropertyB == 1);
            Assert.IsTrue(target.SomeCommand.A == "SomeCommand.A");
            Assert.IsTrue(target.SomeCommand.B == "SomeCommand.B");
            Assert.IsTrue(target.SomeCommand.SubLevel2.D == "SomeCommand.SubLevel2.D");
            Assert.IsTrue(target.SomeCommand.SubLevel2.E == "SomeCommand.SubLevel2.E");
        }
Exemple #9
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();
        }