Пример #1
0
        private static void StoreSingleValue(
            CommandlineArgument opt,
            IHasValue input,
            ParserOptions options,
            List <string> uncollectedArgs,
            Dictionary <string, object> store,
            HashSet <string> errored
            )
        {
            var prop = opt.Key;

            uncollectedArgs.AddRange(input.AllValues.Except(
                                         new[]
            {
                input.SingleValue
            })
                                     );
            if (store.ContainsKey(prop))
            {
                if (!errored.Contains(opt.Key))
                {
                    errored.Add(opt.Key);
                    options.ReportMultipleValuesForSingleValueArgument($"--{opt.LongName}");
                }
            }

            store[prop] = input.SingleValue;
        }
Пример #2
0
        private static void AddHelp(
            Dictionary <string, CommandlineArgument> lookup
            )
        {
            var opt = new CommandlineArgument()
            {
                Key         = CommandlineArgument.HELP_FLAG_KEY,
                Default     = false,
                IsFlag      = true,
                Description = "shows this help",
                IsImplicit  = true,
                LongName    = "help",
                ShortName   = "h"
            };

            if (lookup.ContainsKey(opt.ShortName))
            {
                opt.ShortName = "";
            }
            else
            {
                lookup[opt.ShortName] = opt;
            }

            if (lookup.ContainsKey(opt.LongName))
            {
                opt.LongName = "";
            }
            else
            {
                lookup[opt.LongName] = opt;
            }
        }
Пример #3
0
        private static void SetLongNameIfMissing(CommandlineArgument opt, HashSet <string> existing)
        {
            if (!string.IsNullOrWhiteSpace(opt.LongName))
            {
                return;
            }

            var potential = opt.Key
                            .ToKebabCase()
                            .ToLowerInvariant();

            if (existing.Contains(potential))
            {
                return;
            }

            existing.Add(potential);
            opt.LongName = potential;
        }
Пример #4
0
        private static void SetShortNameIfMissing(CommandlineArgument opt, HashSet <string> existing)
        {
            if (!string.IsNullOrWhiteSpace(opt.ShortName))
            {
                return;
            }

            var firstChar  = opt.Key[0].ToString();
            var potentials = new[] { firstChar.ToLowerInvariant(), firstChar.ToUpperInvariant() };
            var potential  = potentials.FirstOrDefault(p => !existing.Contains(p));

            if (potential is null)
            {
                return;
            }

            existing.Add(potential);
            opt.ShortName = potential;
        }
Пример #5
0
        private static void StoreFlag(
            ParserOptions options,
            CommandlineArgument opt,
            Dictionary <string, object> acc,
            string prop,
            HashSet <string> errored)
        {
            var value = opt.Default ?? true;

            if (acc.TryGetValue(prop, out var existing) &&
                existing != value &&
                !errored.Contains(opt.Key))
            {
                errored.Add(opt.Key);
                options.ReportConflict($"--{opt.LongName}", $"--no-{opt.LongName}");
            }
            else
            {
                acc[opt.Key] = opt.Default ?? true;
            }
        }
Пример #6
0
        private static List <CommandlineArgument> GrokOptionsFor <T>()
        {
            return(typeof(T)
                   .GetProperties(BindingFlags.Instance | BindingFlags.Public)
                   .Aggregate(
                       new List <CommandlineArgument>(),
                       (acc, cur) =>
            {
                var attribs = cur.GetCustomAttributes().ToArray();
                var option = new CommandlineArgument()
                {
                    ShortName = attribs
                                .OfType <ShortNameAttribute>()
                                .FirstOrDefault()
                                ?.Value,
                    LongName = attribs
                               .OfType <LongNameAttribute>()
                               .FirstOrDefault()
                               ?.Value,
                    Description = attribs
                                  .OfType <DescriptionAttribute>()
                                  .FirstOrDefault()
                                  ?.Value,
                    Default = attribs
                              .OfType <DefaultAttribute>()
                              .FirstOrDefault()
                              ?.Value,
                    Property = cur,
                    ConflictsWithKeys = attribs.OfType <ConflictsWithAttribute>()
                                        .Select(a => a.Value)
                                        .ToArray(),
                    IsImplicit = false,
                    IsRequired = attribs.OfType <RequiredAttribute>().Any()
                };

                acc.Add(option);
                return acc;
            }));
        }