Exception Thrown Rather than Error Message And Help When Command Has Both Custom Parser and Validator
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Aptitud para principiantes
- 45/100
Línea de trabajo
Comience con la reproducción de C# proporcionada, centrándose en el parser personalizado y en los callbacks del validador asociados a rootCmdArgs, así como en los puntos de entrada Parse(args)/InvokeAsync(). Rastree cómo la validación y la conversión gestionan el error añadido por el parser cuando ambos callbacks están presentes. Se considera terminado cuando la entrada no válida --dats informa del error del parser junto con la ayuda del comando, en lugar de lanzar una InvalidOperationException no controlada.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
In the code below, running (with SDK 10.0.100-rc.1.25451.107)
dotnet run ./TestOne.cs 12 23 34 --dats ab bc cd
Leads to an exception being thrown
Unhandled exception. System.InvalidOperationException: Argument "--dats" is not two characters long
at System.CommandLine.Binding.ArgumentConverter.GetValueOrDefault[T](ArgumentConversionResult result)
at System.CommandLine.Parsing.ArgumentResult.GetValueOrDefault[T]()
at Program.<>c.<<Main>$>b__0_3(ArgumentResult argRes) in [HIDDEN]\TestOne.cs:line 52
at System.CommandLine.Parsing.ArgumentResult.ValidateAndConvert(Boolean useValidators)
at System.CommandLine.Parsing.ArgumentResult.GetArgumentConversionResult()
at System.CommandLine.Parsing.CommandResult.ValidateArgumentsAndAddDefaultResults(Boolean completeValidation)
at System.CommandLine.Parsing.CommandResult.Validate(Boolean isInnermostCommand)
at System.CommandLine.Parsing.ParseOperation.ValidateAndAddDefaultResults()
at System.CommandLine.Parsing.ParseOperation.Parse()
at System.CommandLine.Parsing.CommandLineParser.Parse(Command command, IReadOnlyList`1 arguments, String rawInput, ParserConfiguration configuration)
at System.CommandLine.Parsing.CommandLineParser.Parse(Command command, IReadOnlyList`1 args, ParserConfiguration configuration)
at System.CommandLine.Command.Parse(IReadOnlyList`1 args, ParserConfiguration configuration)
at Program.<Main>$(String[] args) in [HIDDEN]\TestOne.cs:line 71
at Program.<Main>(String[] args)
Rather than the expected, and more helpful:
Argument "--dats" is not two characters long
Description:
Test app for System.CommandLine
Usage:
TestOne <TestOne>... [options]
Arguments:
<TestOne> Root command arguments. One or more pairs of characters separated by space
Options:
--data <data> Option data items
-?, -h, --help Show help and usage information
--version Show version information
I noticed this when typo'ing the command line in a rather more complex project.
The problem seems to be that the validator triggers the parser, so there is nothing to check for errors reported by the parser. Without the custom parser the expected error & help is reported.
#:package [email protected]
#nullable enable
using System.CommandLine;
using System.CommandLine.Parsing;
using System.Diagnostics;
string[] ParseArguments(ArgumentResult argRes) {
List<string> res = new();
foreach (var a in argRes.Tokens) {
var s = a.Value;
if (s.Length != 2) {
argRes.AddError($"Argument \"{s}\" is not two characters long");
} else {
res.Add(s);
}
}
return res.ToArray();
}
void ValidateArguments(string[] rawValues, Action<string> reportError) {
if (rawValues.Length == 0) {
reportError("No arguments provided");
return;
}
foreach (var rawValue in rawValues) {
if (rawValue.Length != 2) {
reportError($"Argument \"{rawValue}\" is not two characters long");
} else if (rawValue[0] >= rawValue[1]) {
reportError($"In argument \"{rawValue}\" the first letter does not precede, in Unicode code point order, the second");
}
}
}
var dataOption = new Option<string[]>("--data") {
Description = "Option data items",
Arity = ArgumentArity.OneOrMore,
Required = false,
AllowMultipleArgumentsPerToken = true
};
dataOption.Validators.Add(optRes => {
var args = optRes.GetValueOrDefault<string[]>();
ValidateArguments(args, msg => optRes.AddError(msg));
});
var rootCmdArgs = new Argument<string[]>("TestOne") {
Description = "Root command arguments. One or more pairs of characters separated by space",
Arity = ArgumentArity.OneOrMore
};
rootCmdArgs.CustomParser = ParseArguments;
rootCmdArgs.Validators.Add(argRes => {
var args = argRes.GetValueOrDefault<string[]>();
ValidateArguments(args, msg => argRes.AddError(msg));
});
var rootCmd = new RootCommand("Test app for System.CommandLine") {
dataOption,
rootCmdArgs
};
rootCmd.SetAction(parseResult => {
var args = parseResult.GetValue(rootCmdArgs);
var dataArgs = parseResult.GetValue(dataOption);
Debug.Assert(args is not null);
Debug.Assert(dataArgs is not null);
Console.WriteLine("Root command");
Console.WriteLine($" args: {String.Join(", ", args.Select(a => $"\"{a}\""))}");
Console.WriteLine($" data: {String.Join(", ", dataArgs.Select(a => $"\"{a}\""))}");
});
var parse = rootCmd.Parse(args);
await parse.InvokeAsync();
- Lenguaje dominante
- C#
- Estrellas
- 3.7k
- Forks
- 434
- Merge medio
- 4 h 46 min
- PR fusionados (30 d)
- 1
Preparar el entorno
- Sin Dockerfile ni archivo de Docker Compose
- Sin plantilla de pull request
- Leer la guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de dotnet/command-line-api
-
German localization is incompletePosiblemente ocupada @b-v-d-e-v la tomó hace 7 días. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 65/100
dotnet/command-line-api#2852 ·
-
Incomplete French (fr) translation: RequiredOptionWasNotProvided not translatedPosiblemente ocupada @JPBlanc la tomó hace 105 días. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 65/100
dotnet/command-line-api#2822 · 1 comentario ·
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 62/100
dotnet/command-line-api#2792 · 2 comentarios · 16 reacciones ·
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 62/100
dotnet/command-line-api#2704 ·
-
GetCompletions should check exit code of invoked applicationPosiblemente ocupada @baradgur la tomó hace 1276 días. AbiertoArea-Completions bug help wanted
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
dotnet/command-line-api#2137 · 1 comentario · 3 reacciones ·
Todos los issues de dotnet/command-line-api
Issues similares
-
type/automation type/tech-debt
Dificultad 1/5 Menos de una hora Aptitud para principiantes 72/100
Los mantenedores suelen responder en 1 día
-
High-DPI fixes for release/1.3: editor toolbar icons and Color Picker layout (patch included)Abiertono-stack-trace
Dificultad 2/5 1-3 horas Aptitud para principiantes 83/100
Los mantenedores suelen responder en 1 día
-
enhancement
Dificultad 2/5 1-3 horas Aptitud para principiantes 65/100
Los mantenedores suelen responder en 1 día
-
v9 review: TestingAbiertodocs/external squad/utforming
Dificultad 2/5 1-3 horas Aptitud para principiantes 75/100
Altinn/altinn-studio#21041 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 68/100
stryker-mutator/stryker-net#3892 ·
Los mantenedores suelen responder en 1 día