mirror of
				https://github.com/nsnail/spectre.console.git
				synced 2025-11-04 10:35:27 +08:00 
			
		
		
		
	Move Spectre.Console.Cli to it's own package
This commit is contained in:
		
				
					committed by
					
						
						Patrik Svensson
					
				
			
			
				
	
			
			
			
						parent
						
							b600832e00
						
					
				
				
					commit
					36ca22ffac
				
			@@ -0,0 +1,45 @@
 | 
			
		||||
using SystemConsole = System.Console;
 | 
			
		||||
 | 
			
		||||
namespace Spectre.Console.Tests.Data;
 | 
			
		||||
 | 
			
		||||
public abstract class AnimalCommand<TSettings> : Command<TSettings>
 | 
			
		||||
    where TSettings : CommandSettings
 | 
			
		||||
{
 | 
			
		||||
    protected void DumpSettings(CommandContext context, TSettings settings)
 | 
			
		||||
    {
 | 
			
		||||
        if (context == null)
 | 
			
		||||
        {
 | 
			
		||||
            throw new ArgumentNullException(nameof(context));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (settings == null)
 | 
			
		||||
        {
 | 
			
		||||
            throw new ArgumentNullException(nameof(settings));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        var properties = settings.GetType().GetProperties();
 | 
			
		||||
        foreach (var group in properties.GroupBy(x => x.DeclaringType).Reverse())
 | 
			
		||||
        {
 | 
			
		||||
            SystemConsole.WriteLine();
 | 
			
		||||
            SystemConsole.ForegroundColor = ConsoleColor.Yellow;
 | 
			
		||||
            SystemConsole.WriteLine(group.Key.FullName);
 | 
			
		||||
            SystemConsole.ResetColor();
 | 
			
		||||
 | 
			
		||||
            foreach (var property in group)
 | 
			
		||||
            {
 | 
			
		||||
                SystemConsole.WriteLine($"  {property.Name} = {property.GetValue(settings)}");
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (context.Remaining.Raw.Count > 0)
 | 
			
		||||
        {
 | 
			
		||||
            SystemConsole.WriteLine();
 | 
			
		||||
            SystemConsole.ForegroundColor = ConsoleColor.Yellow;
 | 
			
		||||
            SystemConsole.WriteLine("Remaining:");
 | 
			
		||||
            SystemConsole.ResetColor();
 | 
			
		||||
            SystemConsole.WriteLine(string.Join(", ", context.Remaining));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        SystemConsole.WriteLine();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										10
									
								
								test/Spectre.Console.Cli.Tests/Data/Commands/CatCommand.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								test/Spectre.Console.Cli.Tests/Data/Commands/CatCommand.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,10 @@
 | 
			
		||||
namespace Spectre.Console.Tests.Data;
 | 
			
		||||
 | 
			
		||||
public class CatCommand : AnimalCommand<CatSettings>
 | 
			
		||||
{
 | 
			
		||||
    public override int Execute(CommandContext context, CatSettings settings)
 | 
			
		||||
    {
 | 
			
		||||
        DumpSettings(context, settings);
 | 
			
		||||
        return 0;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										31
									
								
								test/Spectre.Console.Cli.Tests/Data/Commands/DogCommand.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								test/Spectre.Console.Cli.Tests/Data/Commands/DogCommand.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,31 @@
 | 
			
		||||
namespace Spectre.Console.Tests.Data;
 | 
			
		||||
 | 
			
		||||
[Description("The dog command.")]
 | 
			
		||||
public class DogCommand : AnimalCommand<DogSettings>
 | 
			
		||||
{
 | 
			
		||||
    public override ValidationResult Validate(CommandContext context, DogSettings settings)
 | 
			
		||||
    {
 | 
			
		||||
        if (context is null)
 | 
			
		||||
        {
 | 
			
		||||
            throw new System.ArgumentNullException(nameof(context));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (settings is null)
 | 
			
		||||
        {
 | 
			
		||||
            throw new System.ArgumentNullException(nameof(settings));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (settings.Age > 100 && !context.Remaining.Raw.Contains("zombie"))
 | 
			
		||||
        {
 | 
			
		||||
            return ValidationResult.Error("Dog is too old...");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return base.Validate(context, settings);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public override int Execute(CommandContext context, DogSettings settings)
 | 
			
		||||
    {
 | 
			
		||||
        DumpSettings(context, settings);
 | 
			
		||||
        return 0;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,34 @@
 | 
			
		||||
namespace Spectre.Console.Tests.Data;
 | 
			
		||||
 | 
			
		||||
public sealed class DumpRemainingCommand : Command<EmptyCommandSettings>
 | 
			
		||||
{
 | 
			
		||||
    private readonly IAnsiConsole _console;
 | 
			
		||||
 | 
			
		||||
    public DumpRemainingCommand(IAnsiConsole console)
 | 
			
		||||
    {
 | 
			
		||||
        _console = console;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public override int Execute(CommandContext context, EmptyCommandSettings settings)
 | 
			
		||||
    {
 | 
			
		||||
        if (context.Remaining.Raw.Count > 0)
 | 
			
		||||
        {
 | 
			
		||||
            _console.WriteLine("# Raw");
 | 
			
		||||
            foreach (var item in context.Remaining.Raw)
 | 
			
		||||
            {
 | 
			
		||||
                _console.WriteLine(item);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (context.Remaining.Parsed.Count > 0)
 | 
			
		||||
        {
 | 
			
		||||
            _console.WriteLine("# Parsed");
 | 
			
		||||
            foreach (var item in context.Remaining.Parsed)
 | 
			
		||||
            {
 | 
			
		||||
                _console.WriteLine(string.Format("{0}={1}", item.Key, string.Join(",", item.Select(x => x))));
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return 0;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,9 @@
 | 
			
		||||
namespace Spectre.Console.Tests.Data;
 | 
			
		||||
 | 
			
		||||
public sealed class EmptyCommand : Command<EmptyCommandSettings>
 | 
			
		||||
{
 | 
			
		||||
    public override int Execute(CommandContext context, EmptyCommandSettings settings)
 | 
			
		||||
    {
 | 
			
		||||
        return 0;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,10 @@
 | 
			
		||||
namespace Spectre.Console.Tests.Data;
 | 
			
		||||
 | 
			
		||||
public sealed class GenericCommand<TSettings> : Command<TSettings>
 | 
			
		||||
    where TSettings : CommandSettings
 | 
			
		||||
{
 | 
			
		||||
    public override int Execute(CommandContext context, TSettings settings)
 | 
			
		||||
    {
 | 
			
		||||
        return 0;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,10 @@
 | 
			
		||||
namespace Spectre.Console.Tests.Data;
 | 
			
		||||
 | 
			
		||||
[Description("The giraffe command.")]
 | 
			
		||||
public sealed class GiraffeCommand : Command<GiraffeSettings>
 | 
			
		||||
{
 | 
			
		||||
    public override int Execute(CommandContext context, GiraffeSettings settings)
 | 
			
		||||
    {
 | 
			
		||||
        return 0;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,9 @@
 | 
			
		||||
namespace Spectre.Console.Tests.Data;
 | 
			
		||||
 | 
			
		||||
public sealed class HiddenOptionsCommand : Command<HiddenOptionSettings>
 | 
			
		||||
{
 | 
			
		||||
    public override int Execute(CommandContext context, HiddenOptionSettings settings)
 | 
			
		||||
    {
 | 
			
		||||
        return 0;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										11
									
								
								test/Spectre.Console.Cli.Tests/Data/Commands/HorseCommand.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								test/Spectre.Console.Cli.Tests/Data/Commands/HorseCommand.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,11 @@
 | 
			
		||||
namespace Spectre.Console.Tests.Data;
 | 
			
		||||
 | 
			
		||||
[Description("The horse command.")]
 | 
			
		||||
public class HorseCommand : AnimalCommand<MammalSettings>
 | 
			
		||||
{
 | 
			
		||||
    public override int Execute(CommandContext context, MammalSettings settings)
 | 
			
		||||
    {
 | 
			
		||||
        DumpSettings(context, settings);
 | 
			
		||||
        return 0;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,9 @@
 | 
			
		||||
namespace Spectre.Console.Tests.Data;
 | 
			
		||||
 | 
			
		||||
public sealed class InvalidCommand : Command<InvalidSettings>
 | 
			
		||||
{
 | 
			
		||||
    public override int Execute(CommandContext context, InvalidSettings settings)
 | 
			
		||||
    {
 | 
			
		||||
        return 0;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										10
									
								
								test/Spectre.Console.Cli.Tests/Data/Commands/LionCommand.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								test/Spectre.Console.Cli.Tests/Data/Commands/LionCommand.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,10 @@
 | 
			
		||||
namespace Spectre.Console.Tests.Data;
 | 
			
		||||
 | 
			
		||||
[Description("The lion command.")]
 | 
			
		||||
public class LionCommand : AnimalCommand<LionSettings>
 | 
			
		||||
{
 | 
			
		||||
    public override int Execute(CommandContext context, LionSettings settings)
 | 
			
		||||
    {
 | 
			
		||||
        return 0;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,12 @@
 | 
			
		||||
namespace Spectre.Console.Tests.Data;
 | 
			
		||||
 | 
			
		||||
public sealed class NoDescriptionCommand : Command<EmptyCommandSettings>
 | 
			
		||||
{
 | 
			
		||||
    [CommandOption("-f|--foo <VALUE>")]
 | 
			
		||||
    public int Foo { get; set; }
 | 
			
		||||
 | 
			
		||||
    public override int Execute(CommandContext context, EmptyCommandSettings settings)
 | 
			
		||||
    {
 | 
			
		||||
        return 0;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,9 @@
 | 
			
		||||
namespace Spectre.Console.Tests.Data;
 | 
			
		||||
 | 
			
		||||
public class OptionVectorCommand : Command<OptionVectorSettings>
 | 
			
		||||
{
 | 
			
		||||
    public override int Execute(CommandContext context, OptionVectorSettings settings)
 | 
			
		||||
    {
 | 
			
		||||
        return 0;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,13 @@
 | 
			
		||||
namespace Spectre.Console.Tests.Data;
 | 
			
		||||
 | 
			
		||||
public sealed class ThrowingCommand : Command<ThrowingCommandSettings>
 | 
			
		||||
{
 | 
			
		||||
    public override int Execute(CommandContext context, ThrowingCommandSettings settings)
 | 
			
		||||
    {
 | 
			
		||||
        throw new InvalidOperationException("W00t?");
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
public sealed class ThrowingCommandSettings : CommandSettings
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,14 @@
 | 
			
		||||
namespace Spectre.Console.Tests.Data;
 | 
			
		||||
 | 
			
		||||
public sealed class CatAgilityConverter : TypeConverter
 | 
			
		||||
{
 | 
			
		||||
    public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
 | 
			
		||||
    {
 | 
			
		||||
        if (value is string stringValue)
 | 
			
		||||
        {
 | 
			
		||||
            return stringValue.Length;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return base.ConvertFrom(context, culture, value);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,14 @@
 | 
			
		||||
namespace Spectre.Console.Tests.Data;
 | 
			
		||||
 | 
			
		||||
public sealed class StringToIntegerConverter : TypeConverter
 | 
			
		||||
{
 | 
			
		||||
    public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
 | 
			
		||||
    {
 | 
			
		||||
        if (value is string stringValue)
 | 
			
		||||
        {
 | 
			
		||||
            return int.Parse(stringValue, CultureInfo.InvariantCulture);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return base.ConvertFrom(context, culture, value);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,14 @@
 | 
			
		||||
namespace Spectre.Console.Tests.Data;
 | 
			
		||||
 | 
			
		||||
public abstract class AnimalSettings : CommandSettings
 | 
			
		||||
{
 | 
			
		||||
    [CommandOption("-a|--alive|--not-dead")]
 | 
			
		||||
    [Description("Indicates whether or not the animal is alive.")]
 | 
			
		||||
    public bool IsAlive { get; set; }
 | 
			
		||||
 | 
			
		||||
    [CommandArgument(1, "[LEGS]")]
 | 
			
		||||
    [Description("The number of legs.")]
 | 
			
		||||
    [EvenNumberValidator("Animals must have an even number of legs.")]
 | 
			
		||||
    [PositiveNumberValidator("Number of legs must be greater than 0.")]
 | 
			
		||||
    public int Legs { get; set; }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,19 @@
 | 
			
		||||
namespace Spectre.Console.Tests.Data;
 | 
			
		||||
 | 
			
		||||
public sealed class ArgumentOrderSettings : CommandSettings
 | 
			
		||||
{
 | 
			
		||||
    [CommandArgument(0, "[QUX]")]
 | 
			
		||||
    public int Qux { get; set; }
 | 
			
		||||
 | 
			
		||||
    [CommandArgument(3, "<CORGI>")]
 | 
			
		||||
    public int Corgi { get; set; }
 | 
			
		||||
 | 
			
		||||
    [CommandArgument(1, "<BAR>")]
 | 
			
		||||
    public int Bar { get; set; }
 | 
			
		||||
 | 
			
		||||
    [CommandArgument(2, "<BAZ>")]
 | 
			
		||||
    public int Baz { get; set; }
 | 
			
		||||
 | 
			
		||||
    [CommandArgument(0, "<FOO>")]
 | 
			
		||||
    public int Foo { get; set; }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,7 @@
 | 
			
		||||
namespace Spectre.Console.Tests.Data;
 | 
			
		||||
 | 
			
		||||
public class ArgumentVectorSettings : CommandSettings
 | 
			
		||||
{
 | 
			
		||||
    [CommandArgument(0, "<Foos>")]
 | 
			
		||||
    public string[] Foo { get; set; }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,8 @@
 | 
			
		||||
namespace Spectre.Console.Tests.Data;
 | 
			
		||||
 | 
			
		||||
public class BarCommandSettings : FooCommandSettings
 | 
			
		||||
{
 | 
			
		||||
    [CommandArgument(0, "<CORGI>")]
 | 
			
		||||
    [Description("The corgi value.")]
 | 
			
		||||
    public string Corgi { get; set; }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										11
									
								
								test/Spectre.Console.Cli.Tests/Data/Settings/CatSettings.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								test/Spectre.Console.Cli.Tests/Data/Settings/CatSettings.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,11 @@
 | 
			
		||||
namespace Spectre.Console.Tests.Data;
 | 
			
		||||
 | 
			
		||||
public class CatSettings : MammalSettings
 | 
			
		||||
{
 | 
			
		||||
    [CommandOption("--agility <VALUE>")]
 | 
			
		||||
    [TypeConverter(typeof(CatAgilityConverter))]
 | 
			
		||||
    [DefaultValue(10)]
 | 
			
		||||
    [Description("The agility between 0 and 100.")]
 | 
			
		||||
    [PositiveNumberValidator("Agility cannot be negative.")]
 | 
			
		||||
    public int Agility { get; set; }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										20
									
								
								test/Spectre.Console.Cli.Tests/Data/Settings/DogSettings.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								test/Spectre.Console.Cli.Tests/Data/Settings/DogSettings.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,20 @@
 | 
			
		||||
namespace Spectre.Console.Tests.Data;
 | 
			
		||||
 | 
			
		||||
public sealed class DogSettings : MammalSettings
 | 
			
		||||
{
 | 
			
		||||
    [CommandArgument(0, "<AGE>")]
 | 
			
		||||
    public int Age { get; set; }
 | 
			
		||||
 | 
			
		||||
    [CommandOption("-g|--good-boy")]
 | 
			
		||||
    public bool GoodBoy { get; set; }
 | 
			
		||||
 | 
			
		||||
    public override ValidationResult Validate()
 | 
			
		||||
    {
 | 
			
		||||
        if (Name == "Tiger")
 | 
			
		||||
        {
 | 
			
		||||
            return ValidationResult.Error("Tiger is not a dog name!");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return ValidationResult.Success();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,5 @@
 | 
			
		||||
namespace Spectre.Console.Tests.Data;
 | 
			
		||||
 | 
			
		||||
public sealed class EmptySettings : CommandSettings
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,8 @@
 | 
			
		||||
namespace Spectre.Console.Tests.Data;
 | 
			
		||||
 | 
			
		||||
public class FooCommandSettings : CommandSettings
 | 
			
		||||
{
 | 
			
		||||
    [CommandArgument(0, "[QUX]")]
 | 
			
		||||
    [Description("The qux value.")]
 | 
			
		||||
    public string Qux { get; set; }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,8 @@
 | 
			
		||||
namespace Spectre.Console.Tests.Data;
 | 
			
		||||
 | 
			
		||||
public sealed class GiraffeSettings : MammalSettings
 | 
			
		||||
{
 | 
			
		||||
    [CommandArgument(0, "<LENGTH>")]
 | 
			
		||||
    [Description("The option description.")]
 | 
			
		||||
    public int Length { get; set; }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,16 @@
 | 
			
		||||
namespace Spectre.Console.Tests.Data;
 | 
			
		||||
 | 
			
		||||
public sealed class HiddenOptionSettings : CommandSettings
 | 
			
		||||
{
 | 
			
		||||
    [CommandArgument(0, "<FOO>")]
 | 
			
		||||
    [Description("Dummy argument FOO")]
 | 
			
		||||
    public int Foo { get; set; }
 | 
			
		||||
 | 
			
		||||
    [CommandOption("--bar", IsHidden = true)]
 | 
			
		||||
    [Description("You should not be able to read this unless you used the 'cli explain' command with the '--hidden' option")]
 | 
			
		||||
    public int Bar { get; set; }
 | 
			
		||||
 | 
			
		||||
    [CommandOption("--baz")]
 | 
			
		||||
    [Description("Dummy option BAZ")]
 | 
			
		||||
    public int Baz { get; set; }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,7 @@
 | 
			
		||||
namespace Spectre.Console.Tests.Data;
 | 
			
		||||
 | 
			
		||||
public sealed class InvalidSettings : CommandSettings
 | 
			
		||||
{
 | 
			
		||||
    [CommandOption("-f|--foo [BAR]")]
 | 
			
		||||
    public string Value { get; set; }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										12
									
								
								test/Spectre.Console.Cli.Tests/Data/Settings/LionSettings.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								test/Spectre.Console.Cli.Tests/Data/Settings/LionSettings.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,12 @@
 | 
			
		||||
namespace Spectre.Console.Tests.Data;
 | 
			
		||||
 | 
			
		||||
public class LionSettings : CatSettings
 | 
			
		||||
{
 | 
			
		||||
    [CommandArgument(0, "<TEETH>")]
 | 
			
		||||
    [Description("The number of teeth the lion has.")]
 | 
			
		||||
    public int Teeth { get; set; }
 | 
			
		||||
 | 
			
		||||
    [CommandOption("-c <CHILDREN>")]
 | 
			
		||||
    [Description("The number of children the lion has.")]
 | 
			
		||||
    public int Children { get; set; }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,7 @@
 | 
			
		||||
namespace Spectre.Console.Tests.Data;
 | 
			
		||||
 | 
			
		||||
public class MammalSettings : AnimalSettings
 | 
			
		||||
{
 | 
			
		||||
    [CommandOption("-n|-p|--name|--pet-name <VALUE>")]
 | 
			
		||||
    public string Name { get; set; }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,19 @@
 | 
			
		||||
namespace Spectre.Console.Tests.Data;
 | 
			
		||||
 | 
			
		||||
public class MultipleArgumentVectorSettings : CommandSettings
 | 
			
		||||
{
 | 
			
		||||
    [CommandArgument(0, "<Foos>")]
 | 
			
		||||
    public string[] Foo { get; set; }
 | 
			
		||||
 | 
			
		||||
    [CommandArgument(0, "<Bars>")]
 | 
			
		||||
    public string[] Bar { get; set; }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
public class MultipleArgumentVectorSpecifiedFirstSettings : CommandSettings
 | 
			
		||||
{
 | 
			
		||||
    [CommandArgument(1, "[Bar]")]
 | 
			
		||||
    public string Bar { get; set; }
 | 
			
		||||
 | 
			
		||||
    [CommandArgument(0, "<Foos>")]
 | 
			
		||||
    public string[] Foo { get; set; }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,10 @@
 | 
			
		||||
namespace Spectre.Console.Tests.Data;
 | 
			
		||||
 | 
			
		||||
public class OptionVectorSettings : CommandSettings
 | 
			
		||||
{
 | 
			
		||||
    [CommandOption("--foo")]
 | 
			
		||||
    public string[] Foo { get; set; }
 | 
			
		||||
 | 
			
		||||
    [CommandOption("--bar")]
 | 
			
		||||
    public int[] Bar { get; set; }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,35 @@
 | 
			
		||||
namespace Spectre.Console.Tests.Data;
 | 
			
		||||
 | 
			
		||||
public sealed class OptionalArgumentWithDefaultValueSettings : CommandSettings
 | 
			
		||||
{
 | 
			
		||||
    [CommandArgument(0, "[GREETING]")]
 | 
			
		||||
    [DefaultValue("Hello World")]
 | 
			
		||||
    public string Greeting { get; set; }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
public sealed class OptionalArgumentWithPropertyInitializerSettings : CommandSettings
 | 
			
		||||
{
 | 
			
		||||
    [CommandArgument(0, "[NAMES]")]
 | 
			
		||||
    public string[] Names { get; set; } = Array.Empty<string>();
 | 
			
		||||
 | 
			
		||||
    [CommandOption("-c")]
 | 
			
		||||
    public int Count { get; set; } = 1;
 | 
			
		||||
 | 
			
		||||
    [CommandOption("-v")]
 | 
			
		||||
    public int Value { get; set; } = 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
public sealed class OptionalArgumentWithDefaultValueAndTypeConverterSettings : CommandSettings
 | 
			
		||||
{
 | 
			
		||||
    [CommandArgument(0, "[GREETING]")]
 | 
			
		||||
    [DefaultValue("5")]
 | 
			
		||||
    [TypeConverter(typeof(StringToIntegerConverter))]
 | 
			
		||||
    public int Greeting { get; set; }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
public sealed class RequiredArgumentWithDefaultValueSettings : CommandSettings
 | 
			
		||||
{
 | 
			
		||||
    [CommandArgument(0, "<GREETING>")]
 | 
			
		||||
    [DefaultValue("Hello World")]
 | 
			
		||||
    public string Greeting { get; set; }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,7 @@
 | 
			
		||||
namespace Spectre.Console.Tests.Data;
 | 
			
		||||
 | 
			
		||||
public sealed class StringOptionSettings : CommandSettings
 | 
			
		||||
{
 | 
			
		||||
    [CommandOption("-f|--foo")]
 | 
			
		||||
    public string Foo { get; set; }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,25 @@
 | 
			
		||||
namespace Spectre.Console.Tests.Data;
 | 
			
		||||
 | 
			
		||||
[AttributeUsage(AttributeTargets.Property, AllowMultiple = true)]
 | 
			
		||||
public sealed class EvenNumberValidatorAttribute : ParameterValidationAttribute
 | 
			
		||||
{
 | 
			
		||||
    public EvenNumberValidatorAttribute(string errorMessage)
 | 
			
		||||
        : base(errorMessage)
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public override ValidationResult Validate(CommandParameterContext context)
 | 
			
		||||
    {
 | 
			
		||||
        if (context.Value is int integer)
 | 
			
		||||
        {
 | 
			
		||||
            if (integer % 2 == 0)
 | 
			
		||||
            {
 | 
			
		||||
                return ValidationResult.Success();
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            return ValidationResult.Error($"Number is not even ({context.Parameter.PropertyName}).");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        throw new InvalidOperationException($"Parameter is not a number ({context.Parameter.PropertyName}).");
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,25 @@
 | 
			
		||||
namespace Spectre.Console.Tests.Data;
 | 
			
		||||
 | 
			
		||||
[AttributeUsage(AttributeTargets.Property, AllowMultiple = true)]
 | 
			
		||||
public sealed class PositiveNumberValidatorAttribute : ParameterValidationAttribute
 | 
			
		||||
{
 | 
			
		||||
    public PositiveNumberValidatorAttribute(string errorMessage)
 | 
			
		||||
        : base(errorMessage)
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public override ValidationResult Validate(CommandParameterContext context)
 | 
			
		||||
    {
 | 
			
		||||
        if (context.Value is int integer)
 | 
			
		||||
        {
 | 
			
		||||
            if (integer > 0)
 | 
			
		||||
            {
 | 
			
		||||
                return ValidationResult.Success();
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            return ValidationResult.Error($"Number is not greater than 0 ({context.Parameter.PropertyName}).");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        throw new InvalidOperationException($"Parameter is not a number ({context.Parameter.PropertyName}).");
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user