BadScript 2
Loading...
Searching...
No Matches
InstanceChooser.cs
Go to the documentation of this file.
1// Copyright 2005-2015 Giacomo Stelluti Scala & Contributors. All rights reserved. See License.md in the project root for license information.
2
3using System;
4using System.Collections.Generic;
5using System.Globalization;
6using System.Linq;
7
8using CSharpx;
9
11
12namespace CommandLine.Core
13{
14 internal static class InstanceChooser
15 {
17 Func<IEnumerable<string>, IEnumerable<OptionSpecification>, Result<IEnumerable<Token>, Error>> tokenizer,
18 IEnumerable<Type> types,
19 IEnumerable<string> arguments,
20 StringComparer nameComparer,
21 bool ignoreValueCase,
22 CultureInfo parsingCulture,
23 bool autoHelp,
24 bool autoVersion,
25 IEnumerable<ErrorType> nonFatalErrors)
26 {
27 return Choose(tokenizer,
28 types,
29 arguments,
30 nameComparer,
31 ignoreValueCase,
32 parsingCulture,
33 autoHelp,
34 autoVersion,
35 false,
36 nonFatalErrors
37 );
38 }
39
41 Func<IEnumerable<string>, IEnumerable<OptionSpecification>, Result<IEnumerable<Token>, Error>> tokenizer,
42 IEnumerable<Type> types,
43 IEnumerable<string> arguments,
44 StringComparer nameComparer,
45 bool ignoreValueCase,
46 CultureInfo parsingCulture,
47 bool autoHelp,
48 bool autoVersion,
49 bool allowMultiInstance,
50 IEnumerable<ErrorType> nonFatalErrors)
51 {
52 IEnumerable<Tuple<Verb, Type>> verbs = Verb.SelectFromTypes(types);
53 IEnumerable<Tuple<Verb, Type>> defaultVerbs = verbs.Where(t => t.Item1.IsDefault);
54
55 int defaultVerbCount = defaultVerbs.Count();
56
57 if (defaultVerbCount > 1)
58 {
59 return MakeNotParsed(types, new MultipleDefaultVerbsError());
60 }
61
62 Tuple<Verb, Type> defaultVerb = defaultVerbCount == 1 ? defaultVerbs.First() : null;
63
65 {
66 string firstArg = arguments.First();
67
68 bool preprocCompare(string command)
69 {
70 return nameComparer.Equals(command, firstArg) ||
71 nameComparer.Equals(string.Concat("--", command), firstArg);
72 }
73
74 return autoHelp && preprocCompare("help") ? MakeNotParsed(types,
76 arguments.Skip(1)
77 .FirstOrDefault() ??
78 string.Empty,
79 nameComparer
80 )
81 ) :
82 autoVersion && preprocCompare("version") ? MakeNotParsed(types, new VersionRequestedError()) :
83 MatchVerb(tokenizer,
84 verbs,
85 defaultVerb,
86 arguments,
87 nameComparer,
88 ignoreValueCase,
89 parsingCulture,
90 autoHelp,
91 autoVersion,
92 allowMultiInstance,
93 nonFatalErrors
94 );
95 }
96
97 return arguments.Any() ? choose() :
98 defaultVerbCount == 1 ? MatchDefaultVerb(tokenizer,
99 verbs,
100 defaultVerb,
101 arguments,
102 nameComparer,
103 ignoreValueCase,
104 parsingCulture,
105 autoHelp,
106 autoVersion,
107 nonFatalErrors
108 ) :
110 }
111
113 Func<IEnumerable<string>, IEnumerable<OptionSpecification>, Result<IEnumerable<Token>, Error>> tokenizer,
114 IEnumerable<Tuple<Verb, Type>> verbs,
115 Tuple<Verb, Type> defaultVerb,
116 IEnumerable<string> arguments,
117 StringComparer nameComparer,
118 bool ignoreValueCase,
119 CultureInfo parsingCulture,
120 bool autoHelp,
121 bool autoVersion,
122 IEnumerable<ErrorType> nonFatalErrors)
123 {
124 return !(defaultVerb is null)
125 ? InstanceBuilder.Build(Maybe.Just<Func<object>>(() => defaultVerb.Item2.AutoDefault()),
126 tokenizer,
127 arguments,
128 nameComparer,
129 ignoreValueCase,
130 parsingCulture,
131 autoHelp,
132 autoVersion,
133 nonFatalErrors
134 )
135 : MakeNotParsed(verbs.Select(v => v.Item2), new BadVerbSelectedError(arguments.First()));
136 }
137
139 Func<IEnumerable<string>, IEnumerable<OptionSpecification>, Result<IEnumerable<Token>, Error>> tokenizer,
140 IEnumerable<Tuple<Verb, Type>> verbs,
141 Tuple<Verb, Type> defaultVerb,
142 IEnumerable<string> arguments,
143 StringComparer nameComparer,
144 bool ignoreValueCase,
145 CultureInfo parsingCulture,
146 bool autoHelp,
147 bool autoVersion,
148 bool allowMultiInstance,
149 IEnumerable<ErrorType> nonFatalErrors)
150 {
151 string firstArg = arguments.First();
152
153 Tuple<Verb, Type> verbUsed = verbs.FirstOrDefault(vt =>
154 nameComparer.Equals(vt.Item1.Name, firstArg) ||
155 vt.Item1.Aliases.Any(alias =>
156 nameComparer.Equals(alias, firstArg)
157 )
158 );
159
160 if (verbUsed == default)
161 {
162 return MatchDefaultVerb(tokenizer,
163 verbs,
164 defaultVerb,
165 arguments,
166 nameComparer,
167 ignoreValueCase,
168 parsingCulture,
169 autoHelp,
170 autoVersion,
171 nonFatalErrors
172 );
173 }
174
175 return InstanceBuilder.Build(Maybe.Just<Func<object>>(() => verbUsed.Item2.AutoDefault()),
176 tokenizer,
177 arguments.Skip(1),
178 nameComparer,
179 ignoreValueCase,
180 parsingCulture,
181 autoHelp,
182 autoVersion,
183 allowMultiInstance,
184 nonFatalErrors
185 );
186 }
187
188 private static HelpVerbRequestedError MakeHelpVerbRequestedError(IEnumerable<Tuple<Verb, Type>> verbs,
189 string verb,
190 StringComparer nameComparer)
191 {
192 return verb.Length > 0
193 ? verbs.SingleOrDefault(v => nameComparer.Equals(v.Item1.Name, verb))
194 .ToMaybe()
195 .MapValueOrDefault(v => new HelpVerbRequestedError(v.Item1.Name, v.Item2, true),
196 new HelpVerbRequestedError(null, null, false)
197 )
198 : new HelpVerbRequestedError(null, null, false);
199 }
200
201 private static NotParsed<object> MakeNotParsed(IEnumerable<Type> types, params Error[] errors)
202 {
203 return new NotParsed<object>(TypeInfo.Create(typeof(NullInstance), types), errors);
204 }
205 }
206}
The Maybe type models an optional value. A value of type Maybe a either contains a value of type a (r...
Definition Maybe.cs:33
Models an error generated when an unknown verb is detected.
Definition Error.cs:445
static HelpVerbRequestedError MakeHelpVerbRequestedError(IEnumerable< Tuple< Verb, Type > > verbs, string verb, StringComparer nameComparer)
static ParserResult< object > MatchVerb(Func< IEnumerable< string >, IEnumerable< OptionSpecification >, Result< IEnumerable< Token >, Error > > tokenizer, IEnumerable< Tuple< Verb, Type > > verbs, Tuple< Verb, Type > defaultVerb, IEnumerable< string > arguments, StringComparer nameComparer, bool ignoreValueCase, CultureInfo parsingCulture, bool autoHelp, bool autoVersion, bool allowMultiInstance, IEnumerable< ErrorType > nonFatalErrors)
static ParserResult< object > MatchDefaultVerb(Func< IEnumerable< string >, IEnumerable< OptionSpecification >, Result< IEnumerable< Token >, Error > > tokenizer, IEnumerable< Tuple< Verb, Type > > verbs, Tuple< Verb, Type > defaultVerb, IEnumerable< string > arguments, StringComparer nameComparer, bool ignoreValueCase, CultureInfo parsingCulture, bool autoHelp, bool autoVersion, IEnumerable< ErrorType > nonFatalErrors)
static ParserResult< object > Choose(Func< IEnumerable< string >, IEnumerable< OptionSpecification >, Result< IEnumerable< Token >, Error > > tokenizer, IEnumerable< Type > types, IEnumerable< string > arguments, StringComparer nameComparer, bool ignoreValueCase, CultureInfo parsingCulture, bool autoHelp, bool autoVersion, IEnumerable< ErrorType > nonFatalErrors)
static ParserResult< object > Choose(Func< IEnumerable< string >, IEnumerable< OptionSpecification >, Result< IEnumerable< Token >, Error > > tokenizer, IEnumerable< Type > types, IEnumerable< string > arguments, StringComparer nameComparer, bool ignoreValueCase, CultureInfo parsingCulture, bool autoHelp, bool autoVersion, bool allowMultiInstance, IEnumerable< ErrorType > nonFatalErrors)
static NotParsed< object > MakeNotParsed(IEnumerable< Type > types, params Error[] errors)
static IEnumerable< Tuple< Verb, Type > > SelectFromTypes(IEnumerable< Type > types)
Definition Verb.cs:47
Base type of all errors.
Definition Error.cs:110
Models an error generated when a user explicitly requests help in verb commands scenario.
Definition Error.cs:463
Models an error generated when multiple default verbs are defined.
Definition Error.cs:605
Models an error generated when no verb is selected.
Definition Error.cs:495
It contains a sequence of CommandLine.Error.
Models a null result when constructing a ParserResult<T> in a faling verbs scenario.
Models a parser result. When inherited by CommandLine.Parsed<T>, it contains an instance of type T w...
static TypeInfo Create(Type current)
Models an error generated when a user explicitly requests version.
Definition Error.cs:504
Represents the result of a computation.