/// <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);
            }
        }
Esempio n. 2
0
 /// <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);
     }
 }
Esempio n. 3
0
        /// <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]));
        }
Esempio n. 4
0
 public override ICommandParseResult <object> ParseCommands(MultipleCommandParseRequest request)
 {
     return(base.ParseCommands(request));
 }
 public CommandTypeResolutionResult Resolve(MultipleCommandParseRequest request, TokenizedCommand command)
 {
     return(_sourceTypeResolver.Resolve(request, command));
 }