|
|
@@ -0,0 +1,181 @@ |
|
|
|
using System; |
|
|
|
|
|
|
|
using Svelto.ECS; |
|
|
|
|
|
|
|
using GamecraftModdingAPI.Utility; |
|
|
|
|
|
|
|
namespace GamecraftModdingAPI.Commands |
|
|
|
{ |
|
|
|
/// <summary> |
|
|
|
/// Custom Command builder. |
|
|
|
/// </summary> |
|
|
|
public class CommandBuilder |
|
|
|
{ |
|
|
|
private string name; |
|
|
|
|
|
|
|
private string description; |
|
|
|
|
|
|
|
private short parameterCount; |
|
|
|
|
|
|
|
private ICustomCommandEngine commandEngine; |
|
|
|
|
|
|
|
/// <summary> |
|
|
|
/// Create a new command builder. |
|
|
|
/// </summary> |
|
|
|
public CommandBuilder() |
|
|
|
{ |
|
|
|
name = ""; |
|
|
|
description = null; |
|
|
|
parameterCount = -1; |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary> |
|
|
|
/// Create and return a command builder. |
|
|
|
/// </summary> |
|
|
|
/// <returns>The builder.</returns> |
|
|
|
public static CommandBuilder Builder() |
|
|
|
{ |
|
|
|
return new CommandBuilder(); |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary> |
|
|
|
/// Create a new command builder. |
|
|
|
/// </summary> |
|
|
|
/// <param name="name">The command name.</param> |
|
|
|
/// <param name="description">The command description (shown in help).</param> |
|
|
|
public CommandBuilder(string name, string description = null) |
|
|
|
{ |
|
|
|
this.name = name; |
|
|
|
this.description = description; |
|
|
|
parameterCount = -1; |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary> |
|
|
|
/// Create and return a command builder. |
|
|
|
/// If name and description are provided, this is equivalent to <code>Builder().Name(name).Description(description)</code> |
|
|
|
/// </summary> |
|
|
|
/// <param name="name">The command name.</param> |
|
|
|
/// <param name="description">The command description (shown in help).</param> |
|
|
|
/// <returns>The builder.</returns> |
|
|
|
public static CommandBuilder Builder(string name, string description = null) |
|
|
|
{ |
|
|
|
return new CommandBuilder(name, description); |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary> |
|
|
|
/// Name the command. |
|
|
|
/// </summary> |
|
|
|
/// <returns>The builder.</returns> |
|
|
|
/// <param name="name">The command name.</param> |
|
|
|
public CommandBuilder Name(string name) |
|
|
|
{ |
|
|
|
this.name = name; |
|
|
|
return this; |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary> |
|
|
|
/// Describe the command. |
|
|
|
/// </summary> |
|
|
|
/// <returns>The builder.</returns> |
|
|
|
/// <param name="description">The command description (shown in help).</param> |
|
|
|
public CommandBuilder Description(string description) |
|
|
|
{ |
|
|
|
this.description = description; |
|
|
|
return this; |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary> |
|
|
|
/// Set the action the command performs. |
|
|
|
/// </summary> |
|
|
|
/// <returns>The builder.</returns> |
|
|
|
/// <param name="action">The action to perform when the command is called.</param> |
|
|
|
public CommandBuilder Action(Action action) |
|
|
|
{ |
|
|
|
parameterCount = 0; |
|
|
|
commandEngine = new SimpleCustomCommandEngine(action, name, description); |
|
|
|
return this; |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary> |
|
|
|
/// Set the action the command performs. |
|
|
|
/// </summary> |
|
|
|
/// <returns>The builder.</returns> |
|
|
|
/// <param name="action">The action to perform when the command is called.</param> |
|
|
|
/// <typeparam name="A">The 1st parameter's type.</typeparam> |
|
|
|
public CommandBuilder Action<A>(Action<A> action) |
|
|
|
{ |
|
|
|
parameterCount = 1; |
|
|
|
commandEngine = new SimpleCustomCommandEngine<A>(action, name, description); |
|
|
|
return this; |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary> |
|
|
|
/// Set the action the command performs. |
|
|
|
/// </summary> |
|
|
|
/// <returns>The builder.</returns> |
|
|
|
/// <param name="action">The action to perform when the command is called.</param> |
|
|
|
/// <typeparam name="A">The 1st parameter's type.</typeparam> |
|
|
|
/// <typeparam name="B">The 2nd parameter's type.</typeparam> |
|
|
|
public CommandBuilder Action<A,B>(Action<A,B> action) |
|
|
|
{ |
|
|
|
parameterCount = 2; |
|
|
|
commandEngine = new SimpleCustomCommandEngine<A,B>(action, name, description); |
|
|
|
return this; |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary> |
|
|
|
/// Set the action the command performs. |
|
|
|
/// </summary> |
|
|
|
/// <returns>The builder.</returns> |
|
|
|
/// <param name="action">The action to perform when the command is called.</param> |
|
|
|
/// <typeparam name="A">The 1st parameter's type.</typeparam> |
|
|
|
/// <typeparam name="B">The 2nd parameter's type.</typeparam> |
|
|
|
/// <typeparam name="C">The 3rd parameter's type.</typeparam> |
|
|
|
public CommandBuilder Action<A,B,C>(Action<A,B,C> action) |
|
|
|
{ |
|
|
|
parameterCount = 3; |
|
|
|
commandEngine = new SimpleCustomCommandEngine<A,B,C>(action, name, description); |
|
|
|
return this; |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary> |
|
|
|
/// Build the command. |
|
|
|
/// </summary> |
|
|
|
/// <returns>The built command.</returns> |
|
|
|
/// <param name="register">Automatically register the command with CommandManager.AddCommand()?</param> |
|
|
|
public ICustomCommandEngine Build(bool register = true) |
|
|
|
{ |
|
|
|
if (string.IsNullOrWhiteSpace(name)) |
|
|
|
{ |
|
|
|
throw new InvalidOperationException("Command name must be defined before Build() is called"); |
|
|
|
} |
|
|
|
if (commandEngine == null) |
|
|
|
{ |
|
|
|
throw new InvalidOperationException("Command action must be defined before Build() is called"); |
|
|
|
} |
|
|
|
if (string.IsNullOrWhiteSpace(description)) |
|
|
|
{ |
|
|
|
Logging.LogWarning($"Command {name} was built without a description"); |
|
|
|
} |
|
|
|
if (register) |
|
|
|
{ |
|
|
|
CommandManager.AddCommand(commandEngine); |
|
|
|
Logging.MetaDebugLog($"Command {FullName()} was automatically registered"); |
|
|
|
} |
|
|
|
return commandEngine; |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary> |
|
|
|
/// Get the full command name, in the form [name]::[description]::[# of parameters] |
|
|
|
/// </summary> |
|
|
|
/// <returns>The name.</returns> |
|
|
|
public string FullName() |
|
|
|
{ |
|
|
|
if (string.IsNullOrWhiteSpace(description)) |
|
|
|
{ |
|
|
|
return name + "::" + parameterCount; |
|
|
|
} |
|
|
|
return name + "::" + description + "::" + parameterCount; |
|
|
|
} |
|
|
|
} |
|
|
|
} |