Title: Creating Commands Order: 6 --- Commands in `Spectre.Console.Cli` are defined by creating a class that inherits from either `Spectre.Console.Cli.Command` or `Spectre.Console.Cli.AsyncCommand`. `Command` must implement an `Execute` method that returns an int where as `AsyncCommand` must implement `ExecuteAsync` returning `Task`. ```csharp public class HelloCommand : Command { public class Settings : LogCommandSettings { [CommandArgument(0, "[Name]")] public string Name { get; set; } } public override int Execute(CommandContext context, Settings settings) { AnsiConsole.MarkupLine($"Hello, [blue]{settings.Name}[/]"); return 0; } } ``` ## Configuring Commands are configured via the [`CommandApp`](commandApp)'s `Configure` method. ```csharp var app = new CommandApp(); app.Configure(config => { config.AddCommand("hello") .WithAlias("hola") .WithDescription("Say hello") .WithExample(new []{"hello", "Phil"}) .WithExample(new []{"hello", "Phil", "--count", "4"}); }); ``` * `WithAlias` allows commands to have multiple names. * `WithDescription` is used by the help renderer to give commands a description when displaying help. * `WithExample` is used by the help renderer to provide examples to the user for running the commands. The parameters is a string array that matches the values passed in `Main(string[] args)`. ## Dependency Injection Constructor injection is supported on commands. See the [`CommandApp`](commandApp) documentation for further information on configuring `Spectre.Console` for your container. ## Validation While the settings can validate themselves, the command also provides a validation. For example, `IFileSystem` might be injected into the command which we want to use to validate that a path passed in exists. ```csharp public override ValidationResult Validate(CommandContext context, Settings settings) { if (_fileSystem.IO.File.Exists(settings.Path)) { return ValidationResult.Error($"Path not found - {settings.Path}"); } return base.Validate(context, settings); } ```