Add parameter value provider support

Adds support for parameter value providers which makes it
possible to set custom values for parameters.
This commit is contained in:
Patrik Svensson
2021-05-08 07:42:28 +02:00
committed by Phil Scott
parent d1d94cdebe
commit 1dd1945297
14 changed files with 208 additions and 27 deletions

View File

@ -13,9 +13,10 @@ namespace Spectre.Console.Cli
public CommandArgument(
Type parameterType, ParameterKind parameterKind, PropertyInfo property, string? description,
TypeConverterAttribute? converter, DefaultValueAttribute? defaultValue,
CommandArgumentAttribute argument, IEnumerable<ParameterValidationAttribute> validators)
CommandArgumentAttribute argument, ParameterValueProviderAttribute? valueProvider,
IEnumerable<ParameterValidationAttribute> validators)
: base(parameterType, parameterKind, property, description, converter, defaultValue,
null, validators, argument.IsRequired)
null, valueProvider, validators, argument.IsRequired)
{
Value = argument.ValueName;
Position = argument.Position;

View File

@ -182,6 +182,7 @@ namespace Spectre.Console.Cli
var description = property.GetCustomAttribute<DescriptionAttribute>();
var converter = property.GetCustomAttribute<TypeConverterAttribute>();
var deconstructor = property.GetCustomAttribute<PairDeconstructorAttribute>();
var valueProvider = property.GetCustomAttribute<ParameterValueProviderAttribute>();
var validators = property.GetCustomAttributes<ParameterValidationAttribute>(true);
var defaultValue = property.GetCustomAttribute<DefaultValueAttribute>();
@ -194,7 +195,8 @@ namespace Spectre.Console.Cli
return new CommandOption(property.PropertyType, kind,
property, description?.Description, converter, deconstructor,
attribute, validators, defaultValue, attribute.ValueIsOptional);
attribute, valueProvider, validators, defaultValue,
attribute.ValueIsOptional);
}
private static CommandArgument BuildArgumentParameter(PropertyInfo property, CommandArgumentAttribute attribute)
@ -202,6 +204,7 @@ namespace Spectre.Console.Cli
var description = property.GetCustomAttribute<DescriptionAttribute>();
var converter = property.GetCustomAttribute<TypeConverterAttribute>();
var defaultValue = property.GetCustomAttribute<DefaultValueAttribute>();
var valueProvider = property.GetCustomAttribute<ParameterValueProviderAttribute>();
var validators = property.GetCustomAttributes<ParameterValidationAttribute>(true);
var kind = GetParameterKind(property.PropertyType);
@ -209,7 +212,8 @@ namespace Spectre.Console.Cli
return new CommandArgument(
property.PropertyType, kind, property,
description?.Description, converter,
defaultValue, attribute, validators);
defaultValue, attribute, valueProvider,
validators);
}
private static ParameterKind GetOptionKind(

View File

@ -16,10 +16,11 @@ namespace Spectre.Console.Cli
public CommandOption(
Type parameterType, ParameterKind parameterKind, PropertyInfo property, string? description,
TypeConverterAttribute? converter, PairDeconstructorAttribute? deconstructor,
CommandOptionAttribute optionAttribute, IEnumerable<ParameterValidationAttribute> validators,
CommandOptionAttribute optionAttribute, ParameterValueProviderAttribute? valueProvider,
IEnumerable<ParameterValidationAttribute> validators,
DefaultValueAttribute? defaultValue, bool valueIsOptional)
: base(parameterType, parameterKind, property, description, converter,
defaultValue, deconstructor, validators, false)
defaultValue, deconstructor, valueProvider, validators, false)
{
LongNames = optionAttribute.LongNames;
ShortNames = optionAttribute.ShortNames;

View File

@ -17,6 +17,7 @@ namespace Spectre.Console.Cli
public TypeConverterAttribute? Converter { get; }
public PairDeconstructorAttribute? PairDeconstructor { get; }
public List<ParameterValidationAttribute> Validators { get; }
public ParameterValueProviderAttribute? ValueProvider { get; }
public bool Required { get; set; }
public string PropertyName => Property.Name;
@ -28,6 +29,7 @@ namespace Spectre.Console.Cli
string? description, TypeConverterAttribute? converter,
DefaultValueAttribute? defaultValue,
PairDeconstructorAttribute? deconstuctor,
ParameterValueProviderAttribute? valueProvider,
IEnumerable<ParameterValidationAttribute> validators, bool required)
{
Id = Guid.NewGuid();
@ -38,6 +40,7 @@ namespace Spectre.Console.Cli
Converter = converter;
DefaultValue = defaultValue;
PairDeconstructor = deconstuctor;
ValueProvider = valueProvider;
Validators = new List<ParameterValidationAttribute>(validators ?? Array.Empty<ParameterValidationAttribute>());
Required = required;
}