using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Svelto.ECS; using GamecraftModdingAPI.Utility; namespace GamecraftModdingAPI.Commands { /// <summary> /// A simple implementation of ICustomCommandEngine sufficient for most commands. /// This version is for commands which take 2 argument(s) /// </summary> public class SimpleCustomCommandEngine<A,B> : ICustomCommandEngine { public string Name { get; } public string Description { get; } private Action<A,B> runCommand; public EntitiesDB entitiesDB { set; private get; } public bool isRemovable => true; public void Dispose() { GamecraftModdingAPI.Utility.Logging.MetaDebugLog($"Unregistering SimpleCustomCommandEngine {this.Name}"); CommandRegistrationHelper.Unregister(this.Name); } public void Ready() { GamecraftModdingAPI.Utility.Logging.MetaDebugLog($"Registering SimpleCustomCommandEngine {this.Name}"); CommandRegistrationHelper.Register<A,B>(this.Name, this.InvokeCatchError, this.Description); } /// <summary> /// Construct the engine /// </summary> /// <param name="command">The command's operation</param> /// <param name="name">The name of the command</param> /// <param name="description">The command's description, shown in command help messages</param> public SimpleCustomCommandEngine(Action<A,B> command, string name, string description) { this.runCommand = command; this.Name = name; this.Description = description; } public void Invoke(A a, B b) { runCommand(a, b); } private void InvokeCatchError(A a, B b) { try { runCommand(a, b); } catch (Exception e) { CommandRuntimeException wrappedException = new CommandRuntimeException($"Command {Name} threw an exception when executed", e); Logging.LogWarning(wrappedException.ToString()); Logging.CommandLogError(wrappedException.ToString()); } } } }