Parameter name is treated as parameter value
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 3/5
- Tiempo estimado
- 1-2 días
- Aptitud para principiantes
- 35/100
Línea de trabajo
Comience en CommandLine.Core.TokenPartitioner.PartitionTokensByType y reproduzca el problema con --option1 --option2 5 usando el ejemplo de C# proporcionado. Siga el estado ScalarTokenFound y verifique que el nombre de una opción escalar solo se conserve cuando va seguido de un valor. Se considera terminado cuando la opción requerida que falta, option1, se informa como un error en lugar de tratar option2 como su valor.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
If I omit parameter value for one parameter name, next parametername is treated as value of the parameter.
Occurred at v2.9.1 from Nuget.
What I observed
Code:
using System;
using CommandLine;
class Options
{
[Option('a', "option1", Required = true)]
public string Option1 { get; set; }
[Option('b', "option2", Required = false)]
public int option2 { get; set; }
}
class Program
{
static int Main(string[] args)
{
return Parser.Default.ParseArguments<Options>(args)
.MapResult(
options => RunAndReturnExitCode(options),
_ => -1);
}
static int RunAndReturnExitCode(Options options)
{
Console.WriteLine($"option1={options.Option1}, option2={options.option2}");
return 0;
}
}
Command line,
$command --option1 --option2 5
gives the result output,
option1=option2, option2=0
But expected result is to report error with lacking of required "option1".
Suggested fix
In the method "CommandLine.Core.TokenPartitioner.PartitionTokensByType", scalarTokens.add(Scalar nem token) shall be occurred only when the following value is confirmed.
public static Tuple<IEnumerable<Token>, IEnumerable<Token>, IEnumerable<Token>, IEnumerable<Token>> PartitionTokensByType(
IEnumerable<Token> tokens,
Func<string, Maybe<TypeDescriptor>> typeLookup)
{
var switchTokens = new List<Token>();
var scalarTokens = new List<Token>();
var sequenceTokens = new List<Token>();
var nonOptionTokens = new List<Token>();
var sequences = new Dictionary<Token, IList<Token>>();
var count = new Dictionary<Token, int>();
var max = new Dictionary<Token, Maybe<int>>();
var state = SequenceState.TokenSearch;
var separatorSeen = false;
Token nameToken = null;
foreach (var token in tokens)
{
if (token.IsValueForced())
{
separatorSeen = false;
nonOptionTokens.Add(token);
}
else if (token.IsName())
{
separatorSeen = false;
if (typeLookup(token.Text).MatchJust(out var info))
{
switch (info.TargetType)
{
case TargetType.Switch:
nameToken = null;
switchTokens.Add(token);
state = SequenceState.TokenSearch;
break;
case TargetType.Scalar:
nameToken = token;
// scalarTokens.Add(nameToken); <- don't add here
state = SequenceState.ScalarTokenFound;
break;
case TargetType.Sequence:
nameToken = token;
if (! sequences.ContainsKey(nameToken))
{
sequences[nameToken] = new List<Token>();
count[nameToken] = 0;
max[nameToken] = info.MaxItems;
}
state = SequenceState.SequenceTokenFound;
break;
}
}
else
{
nameToken = null;
nonOptionTokens.Add(token);
state = SequenceState.TokenSearch;
}
}
else
{
switch (state)
{
case SequenceState.TokenSearch:
case SequenceState.ScalarTokenFound when nameToken == null:
case SequenceState.SequenceTokenFound when nameToken == null:
separatorSeen = false;
nameToken = null;
nonOptionTokens.Add(token);
state = SequenceState.TokenSearch;
break;
case SequenceState.ScalarTokenFound:
separatorSeen = false;
scalarTokens.Add(nameToken); // add here instead so that scalar name token is valid only when a value is given
nameToken = null;
scalarTokens.Add(token);
state = SequenceState.TokenSearch;
break;
......
- Lenguaje dominante
- C#
- Estrellas
- 4.8k
- Forks
- 478
- Métricas de merge de PR
- Sin PR fusionados en 30 d
Guía de contribución
No hay ninguna guía de contribución indexada para este repositorio
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 commandlineparser/commandline
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 68/100
commandlineparser/commandline#951 · 1 comentario ·
-
Code example misses iEnumerable Abierto
Dificultad 1/5 Menos de una hora Aptitud para principiantes 70/100
commandlineparser/commandline#880 · 2 reacciones ·
-
Dificultad 5/5 Más de una semana Aptitud para principiantes 45/100
commandlineparser/commandline#952 ·
-
Dificultad 3/5 1-2 días Aptitud para principiantes 35/100
commandlineparser/commandline#948 ·
-
How to add examples for verbs? Abierto
Dificultad 5/5 Más de una semana Aptitud para principiantes 35/100
commandlineparser/commandline#947 ·
Todos los issues de commandlineparser/commandline
Issues similares
-
CS0162 "Unreachable code detected" warning from a MSBuildTemp .tmp file in every game project Abiertobug
Dificultad 1/5 Menos de una hora Aptitud para principiantes 90/100
-
Type: enhancement
Dificultad 2/5 1-3 horas Aptitud para principiantes 65/100
apache/arrow-adbc#4809 ·
-
type/automation type/tech-debt
Dificultad 2/5 1-3 horas Aptitud para principiantes 70/100
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 65/100
microsoft/vscode-azurefunctions#5197 · 1 comentario ·
-
Dificultad 1/5 Menos de una hora Aptitud para principiantes 85/100
microsoft/microsoft-ui-reactor#1274 ·