public void Add(RantFunctionSignature func) { RantFunctionSignature existing; if (_overloads.TryGetValue(func.Parameters.Length, out existing)) { throw new ArgumentException($"Cannot load function {func} becaue its signature is ambiguous with existing function {existing}."); } if (_paramsArrayFunc != null) { if (func.HasParamArray) { throw new ArgumentException($"Cannot load function {func} because another function with a parameter array was already loaded."); } if (func.Parameters.Length >= _paramsArrayFunc.Parameters.Length) { throw new ArgumentException($"Cannot load function {func} because its signature is ambiguous with {_paramsArrayFunc}."); } } _overloads[func.Parameters.Length] = func; if (func.HasParamArray) { _paramsArrayFunc = func; } }
private static void RegisterFunction(RantFunctionSignature func) { RantFunction group; if (!FunctionTable.TryGetValue(func.Name, out group)) { group = FunctionTable[func.Name] = new RantFunction(func.Name); } group.Add(func); }
internal static void Load() { if (_loaded) { return; } // Get every single private static method in the RantFunctions class foreach (var method in typeof(RantFunctionRegistry).GetMethods(BindingFlags.Static | BindingFlags.NonPublic)) { if (!method.IsStatic) { continue; } var attr = method.GetCustomAttributes(typeof(RantFunctionAttribute), false).FirstOrDefault() as RantFunctionAttribute; if (attr == null) { continue; // Discard methods without a [RantFunction] attribute } // Compile metadata into RantFunctionInfo string name = string.IsNullOrEmpty(attr.Name) ? method.Name.ToLower() : attr.Name; var descAttr = method.GetCustomAttributes(typeof(RantDescriptionAttribute), false).FirstOrDefault() as RantDescriptionAttribute; var info = new RantFunctionSignature(name, descAttr?.Description ?? string.Empty, method); if (Util.ValidateName(name)) { RegisterFunction(info); } foreach (string alias in attr.Aliases.Where(Util.ValidateName)) { RegisterAlias(alias, info.Name); } } _loaded = true; }