/// <inheritdoc /> public virtual ICommandParseResult <object> ParseCommands(MultipleCommandParseRequest request) { try { var untypedCommandCreator = TokenizerProvider(); if (untypedCommandCreator == null) { throw new CommandParserException($"Не удалось получить парсер команд для запроса {request}"); } var tokenizeResult = untypedCommandCreator.Tokenize(request); if (!tokenizeResult.IsSucceed) { return(new UnparsedCommand <object>( new CommandParseError(tokenizeResult.ErrorsText, tokenizeResult.ErrorCode))); } var typeResolver = TypeResolverProvider(); if (typeResolver == null) { throw new CommandParserException($"Не удалось получить резолвер типа модели для запроса {request}"); } var typeResolution = typeResolver.Resolve(request, tokenizeResult.Command); if (!typeResolution.IsSucceed) { return(new UnparsedCommand <object>( new CommandParseError(typeResolution.ErrorsText, typeResolution.ErrorCode))); } var instance = Activator.CreateInstance(typeResolution.CommandType); var initializationRequest = new CommandInitializationRequest( typeResolution.CommandType, instance, tokenizeResult.Command, request); var initializer = InitializerProvider(); var initializationResult = initializer.Initialize(initializationRequest); if (!initializationResult.IsSucceed) { return(new UnparsedCommand <object>( new CommandParseError(initializationResult.ErrorsText, initializationResult.ErrorCode))); } return(new ParsedCommand <object>(initializationResult.InitializedCommand)); } catch (CommandParserException) { throw; } catch (Exception e) { throw new CommandParserException($"Не удалось выполнить разбор команды для запроса {request}", e); } }
/// <inheritdoc /> public ICommandParseResult <object> ParseCommands(string input, Type[] supportedTypes) { try { var request = new MultipleCommandParseRequest(input, supportedTypes); return(ParseStrategy.ParseCommands(request)); } catch (Exception e) { throw new CommandParserException($"Ошибка при разборе команды '{input}''", e); } }
/// <inheritdoc /> public CommandTypeResolutionResult Resolve(MultipleCommandParseRequest request, TokenizedCommand command) { if (request.ModelTypes == null || request.ModelTypes.Length == 0) { throw new ArgumentException("Не заданы типы команд", nameof(request.ModelTypes)); } var typesWithoutVerb = AttributeHelper.AllTypesWithoutAttribute <VerbAttribute>(request.ModelTypes) .Select(t => t.Name) .ToArray(); if (typesWithoutVerb.Length > 0) { return(CommandTypeResolutionResult.Failed( $"Для команд {string.Join(",", typesWithoutVerb)} не задан атрибут '{nameof(VerbAttribute)}'")); } var types = AttributeHelper.AllTypesWithAttribute <VerbAttribute>( request.ModelTypes, a => StringComparer.InvariantCulture.Equals(a.Verb, command.Verb)) .ToArray(); if (types.Length == 0) { return(CommandTypeResolutionResult.Failed( "Не найдена модель для сопоставления с командой. " + $"Проверьте наличие атрибута {nameof(VerbAttribute)} соответствующего команде '{command.Verb}'")); } if (types.Length > 1) { var possibleTypes = string.Join(",", types.Select(t => t.Name)); return(CommandTypeResolutionResult.Failed( $"Для команды '{command.Verb}' найдено несколько возможных моделей сопоставления: {possibleTypes}")); } return(CommandTypeResolutionResult.Resolved(types[0])); }
public override ICommandParseResult <object> ParseCommands(MultipleCommandParseRequest request) { return(base.ParseCommands(request)); }
public CommandTypeResolutionResult Resolve(MultipleCommandParseRequest request, TokenizedCommand command) { return(_sourceTypeResolver.Resolve(request, command)); }