Да, это ещё одна библиотека, которая начинается с префикса Simple. А как их ещё называть?
Поддерживаемые платформы .NET 4.5 и .NET CORE 2.0
Предоставляет механизм для разбора пользовательского ввода формата по типу команды в строготипизированную модель.
class CreatePackageCommand
{
[Parameter("n", "name")]
public string Name { get; set; }
[Parameter("t", "tag", Required = false)]
public string Tag { get; set; }
[Option("h", "hidden")]
public bool IsHidden { get; set; }
}
var input = "create :n 'package name' :t cool_package :h";
/*
var input = "create :name 'package name' :tag cool_package :hidden";
*/
CommandParser.Default.ParseCommand<CreatePackageCommand>(input)
.WhenParsed(CreatePackageCommand command => DoSomething(command))
.WhenNotParsed(err => HandleError(err));
При использовании дефолтного парсера атрибут [Verb]
является обязательным. При этом имена команд должны быть уникальными.
[Verb("create")]
class CreatePackageCommand { ... }
[Verb("update")]
class UpdatePackageCommand { ... }
var commandTypes = new Type[] { typeof(CreatePackageCommand), typeof(UpdatePackageCommand) };
CommandParser.Default.ParseCommands("update :name 'package' :new_name 'new package'", commandTypes)
.WhenParsed<OneCommand>(c1 => HandleOne(c1))
.WhenParsed<TwoCommand>(c2 => HandleTwo(c2))
.WhenNotParsed(err => HandleError(err));
Конфигурация компонента доступна через метод Configure
или через конструктор класса CommandParser
. Конфигурацию можно выполнить всего один раз используя метод Configure
в случае использования глобального экземпляра парсера CommandParser.Default
и один раз при использовании конструктора без параметров. Последующие попытки вызвать метод конфигурации приведут к исключению. Механизм реализован с целью не допустить различия в поведении одного парсера в разных частях приложения. Узнать о состоянии инициализации парсера можно используя флаг CommandParser.IsConfigured
.
CommandParser.Default.Configure(
MutableCommandParserSettings settings => ConfigureSettings(settings));
var parser = new CommandParser(
MutableCommandParserSettings settings => ConfigureSettings(settings));
StringComparsion
- Культура сравнения строк при разборе команд. Значение по умолчанию:StringComparison.InvariantCultureIgnoreCase
;VerbPrefix
- Префикс перед действием команды. В команде/signal
префикс это символ/
. Значение по умолчанию:null
;ArgumentKeyPrefix
- Префикс перед ключом параметра команды. В команде/signal :arg1 value
префикс это символ:
. Значением по умолчанию:
;RequireArgumentKeyPrefix
- Указывает на обязательность указания префикса параметра в команде. Отключение позволяет выполнять разбор команд видаcommand one two three
при этом значения параметров будут отображены на модель в соответствии со порядком атрибутовParameter
на свойствах. Флаги в таком режиме не поддерживаются, как и явное указание отдельных параметров с ключами. Отключать настройку лучше только в случае острой необходимости. Значение по умолчаниюtrue
.
Библиотека позволяет как заменить парсер целиком, реализовав интерфейс ICommandParser
, так и расширить его функционал, унаследовав свой собственный великолепный парсер от моего скучного CommandParser
. Однако, если вы правда собираетесь это делать, зачем вы скачали библиотеку? Впрочем, не мне вас судить.
Помимо полной замены парсера можно заменить отдельные его компоненты. Всего для замены предоставляется 3 компонента:
- Компонент для превращения строки в набор токенов. В библиотеке он представлен интерфейсом
ICommandTokenizer
и стандартной реализациейDefaultCommandTokenizer
; - Компонент для инициализации экземпляра модели команды. Его обязанность перенести полученные токены на свойства экземпляра модели. В библиотеке представлен интерфейсом
ICommandInitializer
и стандартной реализациейParameterAttributeBasedCommandInitializer
; - Компонент для определения типа модели на основе разобранной на токены команды. Используется при вызове
CommandParser.ParseCommands
. В библиотеке представлен интерфейсомICommandTypeResolver
и стандартной реализациейVerbAttributeBasedCommandTypeResolver
.
Замену компонентов парсера на свои можно произвести используя CommandParserBuilder
.
var builder = new CommandParserBuilder();
var parser = builder.
.WithTypeResolver(new CustomCommandTypeResolver())
.WithInitializer(new CustomCommandInitializer())
.WithTokenizer(new CustomCommandTokenizer())
.WithSettings(settings => ConfigureSettings(settings))
.Build();
var command = parser.ParseCommand<Sample>("...");
Подробные примеры замены компонентов билдера представлены в файле Examples.cs.