示例#1
0
        private static void ApplyOption(ref RunContext ctx, IOptionToken token)
        {
            Option?opt = null;

            if (token is ShortOptionToken shortOpt)
            {
                opt = ctx.Command.Options.SingleOrDefault(o => o.ShortName == shortOpt.Content);
            }
            else if (token is LongOptionToken longOpt)
            {
                opt = ctx.Command.Options.SingleOrDefault(o => o.LongName == longOpt.Content);
            }

            if (opt == null)
            {
                throw new RunException($"Unknown option at position {token.Position}");
            }

            if (!TryTakeValue(ref ctx, opt.ValueType, out var value))
            {
                if (opt.ValueType == typeof(bool))
                {
                    value = true;
                }
                else
                {
                    throw new RunException($"Expected value at position {ctx.Tokens.PeekOrDefault()?.Position}");
                }
            }

            ValueSetter.SetValue(ctx.OptionsObj, opt.MemberExpression, value);
        }
示例#2
0
 /// <summary>
 /// Checks if given token matches current option.
 /// </summary>
 /// <param name="token">The token to match.</param>
 /// <returns>True, if given token matches this option; false otherwise.</returns>
 public bool MatchToken(IOptionToken token)
 {
     return(token switch
     {
         ShortOptionToken sToken => MatchToken(sToken),
         LongOptionToken lToken => MatchToken(lToken),
         _ => false,
     });
示例#3
0
        public void AppendOptionToken(IOptionToken optionToken, string argument)
        {
            bool handled = AppendFlag(optionToken, argument) || AppendKeyValueOption(optionToken);

            if (!handled)
            {
                throw new ArgParsingException(ArgsParsingErrorCode.UnknownOptionType, argument);
            }
        }
示例#4
0
        bool AppendFlag(IOptionToken optionToken, string argument)
        {
            if (optionToken.Definition.Type != OptionType.Flag)
            {
                return(false);
            }

            if (flags.ContainsKey(optionToken.Definition))
            {
                throw new ArgParsingException(
                          ArgsParsingErrorCode.DuplicateFlagsInArgs,
                          argument);
            }

            flags.Add(optionToken.Definition, true);
            return(true);
        }
示例#5
0
        bool AppendKeyValueOption(IOptionToken optionToken)
        {
            if (optionToken.Definition.Type != OptionType.KeyValue)
            {
                return(false);
            }
            if (keyValues.ContainsKey(optionToken.Definition))
            {
                keyValues[optionToken.Definition].Add(optionToken.Value);
            }
            else
            {
                keyValues[optionToken.Definition] =
                    new List <string> {
                    optionToken.Value
                };
            }

            return(true);
        }
示例#6
0
        private static void ApplyOption(ref RunContext ctx, IOptionToken token)
        {
            Option?opt = null;

            if (token is ShortOptionToken shortOpt)
            {
                opt = ctx.Command.Options.SingleOrDefault(o => o.ShortName == shortOpt.Content);
            }
            else if (token is LongOptionToken longOpt)
            {
                opt = ctx.Command.Options.SingleOrDefault(o => o.LongName == longOpt.Content);
            }

            if (opt == null)
            {
                throw new RunException($"Unknown option at position {token.Position}");
            }

            var  propertyType = opt.ValueType;
            bool isList       = false;

            if (propertyType.IsGenericType && propertyType.GetGenericTypeDefinition() == typeof(IList <>))
            {
                propertyType = propertyType.GetGenericArguments()[0];
                isList       = true;
            }

            if (!TryTakeValue(ref ctx, propertyType, out var value))
            {
                if (opt.ValueType == typeof(bool))
                {
                    value = true;
                }
                else
                {
                    throw new RunException($"Expected value at position {ctx.Tokens.PeekOrDefault()?.Position}");
                }
            }

            ValueSetter.SetValue(ctx.OptionsObj, opt.MemberExpression, value, isList);
        }
示例#7
0
        public void AddOption(IOptionToken token)
        {
            var info = GetOptionInfo(token);

            if (info.IsCollection)
            {
                assignedOptions.Add(
                    new CollectionOptionParser(info, info.ChooseConverter(convertersFactory) as CollectionConverter, token));
            }
            else if (assignedOptions.Exists(p => p.OptionToken.Equals(token)))
            {
                throw new ArgumentException("This option was already declared.");
            }
            else if (info.IsImplicit)
            {
                assignedOptions.Add(
                    new ImplicitOptionParser(info, info.ChooseConverter(convertersFactory) as IValueConverter, token));
            }
            else
            {
                assignedOptions.Add(
                    new SingleValueOptionParser(info, info.ChooseConverter(convertersFactory) as IValueConverter, token));
            }
        }
示例#8
0
 public ImplicitOptionParser(ParsingArgumentInfo argumentInfo, IValueConverter valueConverter, IOptionToken optionToken)
     : base(argumentInfo, valueConverter, optionToken)
 {
 }
示例#9
0
 private ParsingOptionInfo GetOptionInfo(IOptionToken token)
 => typeInfo.GetMatchingOptionInfo(token)
 ?? throw new ArgumentException($"This type does not contain the {token} option.", nameof(token));
示例#10
0
 protected void HandleOption(IOptionToken token)
 {
     EnsureLastOptionSet();
     builder.AddOption(token);
 }
示例#11
0
 public SingleValueOptionParser(ParsingArgumentInfo argumentInfo, IValueConverter valueConverter, IOptionToken optionToken) : base(argumentInfo, valueConverter)
 {
     OptionToken = optionToken ?? throw new ArgumentNullException(nameof(optionToken));
 }
示例#12
0
 public AssignedValueToken(IOptionToken option, IValueToken value)
 {
     Option = option;
     Value  = value;
 }
示例#13
0
 public CollectionOptionParser(ParsingArgumentInfo argumentInfo, CollectionConverter converter, IOptionToken optionToken)
     : base(argumentInfo, converter)
 {
     OptionToken = optionToken;
 }
示例#14
0
 /// <summary>
 /// Gets <see cref="ParsingOptionInfo"/> that matches the given token.
 /// </summary>
 /// <param name="token">Token to be matched.</param>
 /// <returns><see cref="ParsingOptionInfo"/> that matches the given token.</returns>
 public ParsingOptionInfo GetMatchingOptionInfo(IOptionToken token)
 => Options.SingleOrDefault(x => x.MatchToken(token));