public static TypinException CannotConvertMultipleValuesToNonScalar(CommandParameterSchema parameter, IReadOnlyList <string> values)
        {
            string message = $@"
Parameter {parameter} expects a single value, but provided with multiple:
{values.Select(v => v.Quote()).JoinToString(' ')}";

            return(new TypinException(message.Trim()));
        }
 public static TypinException CannotConvertMultipleValuesToNonScalar(ArgumentSchema argument, IReadOnlyList <string> values)
 {
     return(argument switch
     {
         CommandParameterSchema parameter => CannotConvertMultipleValuesToNonScalar(parameter, values),
         CommandOptionSchema option => CannotConvertMultipleValuesToNonScalar(option, values),
         _ => throw new ArgumentOutOfRangeException(nameof(argument))
     });
Beispiel #3
0
        /// <summary>
        /// Binds parameter inputs in command instance.
        /// </summary>
        public static void BindParameters(this CommandSchema commandSchema, ICommand instance, IReadOnlyList <CommandParameterInput> parameterInputs)
        {
            IReadOnlyList <CommandParameterSchema> parameters = commandSchema.Parameters;

            // All inputs must be bound
            int remainingParameters = parameters.Count;
            int remainingInputs     = parameterInputs.Count;

            if (remainingParameters > remainingInputs)
            {
                throw ArgumentBindingExceptions.ParameterNotSet(parameters.TakeLast(remainingParameters - remainingInputs));
            }

            // Scalar parameters
            int i = 0;

            for (; i < parameters.Count && parameters[i].IsScalar; ++i)
            {
                CommandParameterSchema parameter   = parameters[i];
                CommandParameterInput  scalarInput = parameterInputs[i];

                parameter.BindOn(instance, scalarInput.Value);

                --remainingParameters;
                --remainingInputs;
            }

            // Non-scalar parameter (only one is allowed)
            if (i < parameters.Count && !parameters[i].IsScalar)
            {
                CommandParameterSchema nonScalarParameter = parameters[i];

                string[] nonScalarValues = parameterInputs.TakeLast(remainingInputs)
                                           .Select(p => p.Value)
                                           .ToArray();

                // Parameters are required by default and so a non-scalar parameter must be bound to at least one value
                if (!nonScalarValues.Any())
                {
                    throw ArgumentBindingExceptions.ParameterNotSet(new[] { nonScalarParameter });
                }

                nonScalarParameter.BindOn(instance, nonScalarValues);
                --remainingParameters;
                remainingInputs = 0;
            }

            // Ensure all inputs were bound
            if (remainingInputs > 0)
            {
                throw ArgumentBindingExceptions.UnrecognizedParametersProvided(parameterInputs.TakeLast(remainingInputs));
            }
        }
Beispiel #4
0
        internal static TypinException NonLastNonScalarParameter(
            CommandSchema command,
            CommandParameterSchema invalidParameter)
        {
            var message = $@"
Command '{command.Type.FullName}' is invalid because it contains a non-scalar parameter which is not the last in order:
{invalidParameter}

Non-scalar parameter is such that is bound from more than one value (e.g. array).
Only one parameter in a command may be non-scalar and it must be the last one in order.

If it's not feasible to fit into these constraints, consider using options instead as they don't have these limitations.";

            return(new TypinException(message.Trim()));
        }