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; }
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; } }
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; }
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; }
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; } }
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; })); }