internal async Task Invoke(List <string> command, MethodContext context) { command.RemoveRange(0, Structure.Count); // Remove uneded structure part of command object[] formattedParameters = new object[Parameters.Count]; for (int i = 0; i < Parameters.Count; i++) { YParameter parameter = Parameters[i]; if (parameter.IsParam) { if (command.Count - i < 0) { break; } Type indexType = parameter.Type.GetElementType(); object[] param = (object[])Activator.CreateInstance(parameter.Type, new object[] { command.Count - i }); for (int a = 0; a < command.Count - i; a++) { param[a] = ParseParameter(command[i + a], indexType); } formattedParameters[i] = param; break; } // Check and insert optinal parameter if there is one if (i >= command.Count || (command[i] == null && parameter.IsOptional)) { formattedParameters[i] = parameter.HasDefault ? parameter.Default : null; continue; } formattedParameters[i] = ParseParameter(command[i], parameter.Type); } Parent.SetContext(context); await Parent.RunCommand(method.Name, formattedParameters.Length, formattedParameters); }
internal YCommand(MethodInfo method) { Command command = method.GetCustomAttribute <Command>(); Summary summary = method.GetCustomAttribute <Summary>(); Name name = method.GetCustomAttribute <Name>(); ParameterInfo[] parameters = method.GetParameters(); Structure = command.CommandStructure; Parameters = new List <YParameter>(); Name = name?.Value ?? method.Name; MethodName = method.Name; Summary = summary?.Value; this.method = method; for (int i = 0; i < parameters.Length; i++) { YParameter parameter = new YParameter(parameters[i]); Parameters.Add(parameter); } }
/// <summary> /// Check if parameters is matching the YCommand. /// </summary> /// <param name="command"></param> /// <param name="yCommand"></param> /// <returns></returns> int ValidateParams(List <string> command, YCommand yCommand) { for (int i = 0; i < yCommand.Parameters.Count; i++) { YParameter parameter = yCommand.Parameters[i]; Type expectedType = parameter.Type; if (i + StructureLength >= command.Count) { // Check the last params parameters here if (parameter.IsParam) { return(yCommand.Parameters.Count); } if (parameter.IsOptional) { continue; } return(-1); } if (parameter.IsParam) { return(yCommand.Parameters.Count); } if (!IsOfType(command[StructureLength + i], expectedType)) { return(-1); } } return(yCommand.Parameters.Count); }