private void MapKeyedOptions(
            ICommandInitializationRequest request,
            IEnumerable <AttributeHelper.AttributeExtendedPropertyInfo <OptionAttribute> > options,
            TokenizedCommand tokenizedCommand,
            IDictionary <string, string> errors,
            ICollection <Exception> exceptions)
        {
            foreach (var option in options)
            {
                if (!tokenizedCommand.Arguments.Any(a => option.Attribute.NameEquals(a.Key, Settings.StringComparsion)))
                {
                    continue;
                }

                if (!option.PropertyInfo.CanWrite)
                {
                    errors.Add(option.Attribute.LongName,
                               $"Невозможно установить свойство '{option.PropertyInfo.Name}' " +
                               $"модели '{request.CommandType.Name}'");

                    continue;
                }

                try
                {
                    option.PropertyInfo.SetValue(request.CommandInstance, true);
                }
                catch (Exception e)
                {
                    exceptions.Add(
                        new CommandParserException($"Исключение при установке свойства '{option.PropertyInfo.Name}'", e));
                }
            }
        }
 public CommandInitializationRequest(
     Type commandType, object commandInstance, TokenizedCommand tokenizedCommand, ICommandParseRequest parseRequest)
 {
     CommandType      = commandType;
     CommandInstance  = commandInstance;
     TokenizedCommand = tokenizedCommand;
     ParseRequest     = parseRequest;
 }
 public CommandTypeResolutionResult Resolve(MultipleCommandParseRequest request, TokenizedCommand command)
 {
     return(_sourceTypeResolver.Resolve(request, command));
 }
Example #4
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]));
        }