Nils Andresen 32d7ea15bd
Change LogCommandSettings to CommandSettings in example
Instead of `LogCommandSettings` for the `Settings` of the `HelloCommand`
2021-07-15 09:39:25 +02:00

64 lines
2.2 KiB
Markdown

Title: Creating Commands
Order: 6
---
Commands in `Spectre.Console.Cli` are defined by creating a class that inherits from either `Spectre.Console.Cli.Command<TSettings>` or `Spectre.Console.Cli.AsyncCommand<TSettings>`. `Command<TSettings>` must implement an `Execute` method that returns an int where as `AsyncCommand<TSettings>` must implement `ExecuteAsync` returning `Task<int>`.
```csharp
public class HelloCommand : Command<HelloCommand.Settings>
{
public class Settings : CommandSettings
{
[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<HelloCommand>("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);
}
```