/// <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)); } }
private void BindParameters(ICommand instance, IReadOnlyList <CommandParameterInput> parameterInputs) { // All inputs must be bound List <CommandParameterInput> remainingParameterInputs = parameterInputs.ToList(); // Scalar parameters CommandParameterSchema[] scalarParameters = Parameters.OrderBy(p => p.Order) .TakeWhile(p => p.IsScalar) .ToArray(); for (int i = 0; i < scalarParameters.Length; i++) { CommandParameterSchema parameter = scalarParameters[i]; CommandParameterInput scalarInput = i < parameterInputs.Count ? parameterInputs[i] : throw EndUserTypinExceptions.ParameterNotSet(parameter); parameter.BindOn(instance, scalarInput.Value); remainingParameterInputs.Remove(scalarInput); } // Non-scalar parameter (only one is allowed) CommandParameterSchema nonScalarParameter = Parameters.OrderBy(p => p.Order) .FirstOrDefault(p => !p.IsScalar); if (nonScalarParameter != null) { string[] nonScalarValues = parameterInputs.Skip(scalarParameters.Length) .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 EndUserTypinExceptions.ParameterNotSet(nonScalarParameter); } nonScalarParameter.BindOn(instance, nonScalarValues); remainingParameterInputs.Clear(); } // Ensure all inputs were bound if (remainingParameterInputs.Any()) { throw EndUserTypinExceptions.UnrecognizedParametersProvided(remainingParameterInputs); } }