mirror of
https://github.com/Stone-Red-Code/Commander.NET.git
synced 2026-09-04 00:46:08 +02:00
Change namespace and improve PrintHelp method
This commit is contained in:
@@ -1,13 +1,13 @@
|
||||
using System.Text;
|
||||
|
||||
namespace Commander_Net;
|
||||
namespace Commander;
|
||||
|
||||
public class Command
|
||||
{
|
||||
internal readonly List<Command> subCommands = new();
|
||||
public string[] Identifiers { get; init; }
|
||||
public Func<string, CommandResult> Method { get; init; }
|
||||
public HelpText HelpText { get; init; }
|
||||
public string[] Identifiers { get; set; }
|
||||
public Func<string, CommandResult> Method { get; set; }
|
||||
public HelpText HelpText { get; set; }
|
||||
|
||||
public Command()
|
||||
{
|
||||
@@ -57,6 +57,24 @@ public class Command
|
||||
return command;
|
||||
}
|
||||
|
||||
public Command WithDescription(string description)
|
||||
{
|
||||
HelpText = description;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Command WithIdentifiers(params string[] identifiers)
|
||||
{
|
||||
Identifiers = identifiers;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Command WithMethod(Func<string, CommandResult> method)
|
||||
{
|
||||
Method = method;
|
||||
return this;
|
||||
}
|
||||
|
||||
internal List<CommandResult> ExecuteMultible(string input, List<CommandResult>? commandResults = null)
|
||||
{
|
||||
string[] inputParts = input.Split(' ');
|
||||
@@ -109,15 +127,31 @@ public class Command
|
||||
}
|
||||
}
|
||||
|
||||
internal string GetHelp(string input, int indentation = 2)
|
||||
internal string GetHelp(string input, int indentation = 2, int paddingSize = 0, bool includeDescription = true)
|
||||
{
|
||||
string[] inputParts = input.Split(' ');
|
||||
|
||||
StringBuilder helpText = new StringBuilder($"{string.Join(" | ", Identifiers)} > {HelpText?.Description}");
|
||||
if (paddingSize - indentation < 0)
|
||||
{
|
||||
paddingSize = indentation;
|
||||
}
|
||||
|
||||
StringBuilder helpText = new StringBuilder(string.Join(" | ", Identifiers).PadRight(paddingSize - indentation));
|
||||
|
||||
if (!string.IsNullOrWhiteSpace(HelpText.Description) && includeDescription)
|
||||
{
|
||||
_ = helpText.Append($" > {HelpText.Description}");
|
||||
}
|
||||
|
||||
foreach (Command command in subCommands.Where(command => command.Identifiers.Contains(inputParts[0]) || string.IsNullOrWhiteSpace(input)))
|
||||
{
|
||||
_ = helpText.Append($"{Environment.NewLine}{new string(' ', indentation)}{command.GetHelp(string.Join(' ', inputParts.Skip(1)), indentation + 2)}");
|
||||
_ = helpText.Append($"{Environment.NewLine}{new string(' ', indentation)}{command.GetHelp(string.Join(' ', inputParts.Skip(1)), indentation + 2, paddingSize, includeDescription)}");
|
||||
}
|
||||
|
||||
// Indentation is 2 when this is called from the Commander class/not a subcommand
|
||||
if (subCommands.Count > 0 && indentation == 2)
|
||||
{
|
||||
_ = helpText.AppendLine();
|
||||
}
|
||||
|
||||
return helpText.ToString();
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
namespace Commander_Net;
|
||||
namespace Commander;
|
||||
|
||||
public class CommandResult
|
||||
{
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
namespace Commander_Net;
|
||||
namespace Commander;
|
||||
|
||||
public enum ResultType
|
||||
{
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
<PackageReadmeFile>README.md</PackageReadmeFile>
|
||||
<PackageLicenseFile>LICENSE</PackageLicenseFile>
|
||||
<PackageId>Console.$(AssemblyName)</PackageId>
|
||||
<RootNamespace>Commander_Net</RootNamespace>
|
||||
<RootNamespace>Commander</RootNamespace>
|
||||
<RepositoryUrl>https://github.com/Stone-Red-Code/Commander.NET</RepositoryUrl>
|
||||
<PackageTags>CLI, Console, Commands</PackageTags>
|
||||
<Product>$(AssemblyName)</Product>
|
||||
|
||||
@@ -1,11 +1,16 @@
|
||||
using System.Text;
|
||||
|
||||
namespace Commander_Net;
|
||||
namespace Commander;
|
||||
|
||||
public class Commander
|
||||
{
|
||||
private readonly List<Command> commands = new();
|
||||
|
||||
public Command Register()
|
||||
{
|
||||
return Register(new Command());
|
||||
}
|
||||
|
||||
public Command Register(Action<string> method, params string[] identifiers)
|
||||
{
|
||||
return Register(method, new HelpText(), identifiers);
|
||||
@@ -40,7 +45,7 @@ public class Commander
|
||||
return command;
|
||||
}
|
||||
|
||||
public bool ExecuteMultible(string input, out List<CommandResult> commandResults)
|
||||
public bool ExecuteMultiple(string input, out List<CommandResult> commandResults)
|
||||
{
|
||||
List<CommandResult> internalCommandResults = new List<CommandResult>();
|
||||
string[] inputParts = input.Split(' ');
|
||||
@@ -80,10 +85,21 @@ public class Commander
|
||||
|
||||
foreach (Command command in commands.Where(command => command.Identifiers.Contains(inputParts[0]) || string.IsNullOrWhiteSpace(input)))
|
||||
{
|
||||
_ = internalHelpText.AppendLine(command.GetHelp(string.Join(' ', inputParts.Skip(1))));
|
||||
_ = internalHelpText.AppendLine(command.GetHelp(string.Join(' ', inputParts.Skip(1)), includeDescription: false));
|
||||
}
|
||||
|
||||
helpText = internalHelpText.ToString();
|
||||
|
||||
int longestLine = helpText.Split(Environment.NewLine).Max(line => line.Length) + 2;
|
||||
|
||||
_ = internalHelpText.Clear();
|
||||
foreach (Command command in commands.Where(command => command.Identifiers.Contains(inputParts[0]) || string.IsNullOrWhiteSpace(input)))
|
||||
{
|
||||
_ = internalHelpText.AppendLine(command.GetHelp(string.Join(' ', inputParts.Skip(1)), paddingSize: longestLine));
|
||||
}
|
||||
|
||||
helpText = internalHelpText.ToString();
|
||||
|
||||
return !string.IsNullOrWhiteSpace(helpText);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
namespace Commander_Net;
|
||||
namespace Commander;
|
||||
|
||||
public class HelpText
|
||||
{
|
||||
|
||||
@@ -1,18 +1,21 @@
|
||||
using Commander_Net;
|
||||
using Commander;
|
||||
|
||||
Console.WriteLine("Hello, World!");
|
||||
|
||||
Commander commander = new Commander();
|
||||
Commander.Commander commander = new Commander.Commander();
|
||||
Command sayCommand = commander.Register(HahaYes, "say", "yell");
|
||||
Command kekCommand = sayCommand.Register(HahaYesSub, "kek");
|
||||
kekCommand.Register(HahaYesSub, "lol");
|
||||
|
||||
commander.Register(HahaNo, "scream", "yell");
|
||||
commander.Register(HahaNo, (HelpText)"AAAAAH", "scream", "yell");
|
||||
commander.Register(Add, "add");
|
||||
commander.Register((args) => Console.Clear(), "clear");
|
||||
commander.Register((input) => commander.PrintHelp(input) ? CommandResult.Success() : CommandResult.InvalidInput(), "help");
|
||||
commander.Register()
|
||||
.WithMethod((input) => commander.PrintHelp(input) ? CommandResult.Success() : CommandResult.InvalidInput())
|
||||
.WithDescription("Cool help command")
|
||||
.WithIdentifiers("help", "?");
|
||||
|
||||
Command fancyCommand = commander.Register(_ => CommandResult.InvalidInput("Nonono"), "fancy");
|
||||
Command fancyCommand = commander.Register(_ => CommandResult.InvalidInput("Nonono"), (HelpText)"Very fancy commands", "fancy");
|
||||
fancyCommand.Register(new Command()
|
||||
{
|
||||
Identifiers = new string[] { "yes", "YES" },
|
||||
@@ -27,9 +30,16 @@ fancyCommand.Register(new Command()
|
||||
Method = (i) => { Console.WriteLine($"Yes, {i} is not very fancy!"); return new CommandResult(ResultType.Success); }
|
||||
});
|
||||
|
||||
fancyCommand.Register(new Command()
|
||||
{
|
||||
Identifiers = new string[] { "no", "NO" },
|
||||
HelpText = "Says that the input is not fancy",
|
||||
Method = (i) => { Console.WriteLine($"Yes, {i} is not very fancy!"); return new CommandResult(ResultType.Success); }
|
||||
});
|
||||
|
||||
while (true)
|
||||
{
|
||||
if (commander.ExecuteMultible(Console.ReadLine()!, out List<CommandResult> commandResults))
|
||||
if (commander.ExecuteMultiple(Console.ReadLine()!, out List<CommandResult> commandResults))
|
||||
{
|
||||
foreach (CommandResult commandResult in commandResults)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user