public static float NextFloatArg(CIterator <string> iter)
        {
            string arg = NextArg(iter);
            float  value;

            if (float.TryParse(arg, out value))
            {
                return(value);
            }

            throw new CCommandException("Can't parse float arg: '" + arg + "'");
        }
        public static int NextIntArg(CIterator <string> iter)
        {
            string arg = NextArg(iter);
            int    value;

            if (int.TryParse(arg, out value))
            {
                return(value);
            }

            throw new CCommandException("Can't parse int arg: '" + arg + "'");
        }
        internal static List <object> ResolveInvokeParameters(ParameterInfo[] parameters, string[] invokeArgs)
        {
            List <object> list = new List <object>(invokeArgs.Length);

            CIterator <string> iter = new CIterator <string>(invokeArgs);

            foreach (ParameterInfo param in parameters)
            {
                list.Add(ResolveInvokeParameter(param, iter));
            }

            return(list);
        }
        public static string NextArg(CIterator <string> iter)
        {
            if (iter.HasNext())
            {
                string arg = CStringUtils.UnArg(iter.Next());
                if (!IsValidArg(arg))
                {
                    throw new CCommandException("Invalid arg: " + arg);
                }

                return(arg);
            }

            throw new CCommandException("Unexpected end of args");
        }
        public static bool NextBoolArg(CIterator <string> iter)
        {
            string arg = NextArg(iter).ToLower();

            if (arg == "1" || arg == "yes" || arg == "true")
            {
                return(true);
            }
            if (arg == "0" || arg == "no" || arg == "false")
            {
                return(false);
            }

            throw new CCommandException("Can't parse bool arg: '" + arg + "'");
        }
        public static bool Invoke(object target, MethodInfo method, string[] invokeArgs)
        {
            ParameterInfo[] parameters = method.GetParameters();
            if (parameters.Length == 0)
            {
                return(Invoke(target, method, EMPTY_INVOKE_ARGS));
            }

            List <object> invokeList = new List <object>(invokeArgs.Length);

            CIterator <string> iter = new CIterator <string>(invokeArgs);

            foreach (ParameterInfo param in parameters)
            {
                invokeList.Add(ResolveInvokeParameter(param, iter));
            }

            return(Invoke(target, method, invokeList.ToArray()));
        }
        private static object ResolveInvokeParameter(ParameterInfo param, CIterator <string> iter)
        {
            if (param.IsOptional && !iter.HasNext())
            {
                return(param.DefaultValue);
            }

            Type type = param.ParameterType;

            if (type == typeof(string[]))
            {
                List <string> values = new List <string>();
                while (iter.HasNext())
                {
                    values.Add(NextArg(iter));
                }
                return(values.ToArray());
            }

            if (type == typeof(string))
            {
                return(NextArg(iter));
            }

            if (type == typeof(float))
            {
                return(NextFloatArg(iter));
            }

            if (type == typeof(int))
            {
                return(NextIntArg(iter));
            }

            if (type == typeof(bool))
            {
                return(NextBoolArg(iter));
            }

            if (type == typeof(Vector2))
            {
                float x = NextFloatArg(iter);
                float y = NextFloatArg(iter);

                return(new Vector2(x, y));
            }

            if (type == typeof(Vector3))
            {
                float x = NextFloatArg(iter);
                float y = NextFloatArg(iter);
                float z = NextFloatArg(iter);

                return(new Vector3(x, y, z));
            }

            if (type == typeof(Vector4))
            {
                float x = NextFloatArg(iter);
                float y = NextFloatArg(iter);
                float z = NextFloatArg(iter);
                float w = NextFloatArg(iter);

                return(new Vector4(x, y, z, w));
            }

            if (type == typeof(int[]))
            {
                List <int> values = new List <int>();
                while (iter.HasNext())
                {
                    values.Add(NextIntArg(iter));
                }
                return(values.ToArray());
            }

            if (type == typeof(float[]))
            {
                List <float> values = new List <float>();
                while (iter.HasNext())
                {
                    values.Add(NextFloatArg(iter));
                }
                return(values.ToArray());
            }

            if (type == typeof(bool[]))
            {
                List <bool> values = new List <bool>();
                while (iter.HasNext())
                {
                    values.Add(NextBoolArg(iter));
                }
                return(values.ToArray());
            }

            throw new CCommandException("Unsupported value type: " + type);
        }