basic command system and argument processing added.

This commit is contained in:
Harrison Deng 2018-12-08 16:26:40 -06:00
parent 901f900527
commit 6c37b11e07
4 changed files with 86 additions and 2 deletions

View File

@ -7,17 +7,71 @@ namespace RecrownedAthenaeum.Tools.CommandProcessor
internal class CommandEngine
{
public bool running;
public readonly Dictionary<string, ICommandEngineCommand> commands;
public CommandEngine()
{
commands = new Dictionary<string, ICommandEngineCommand>();
}
internal void Run()
{
while (running)
{
string command = Console.ReadLine();
Process(command);
try
{
Process(command);
}
catch (ArgumentException)
{
Console.WriteLine("Command not found.");
}
}
}
public void Process(string command)
public void Process(string commandAndArguments)
{
string command = commandAndArguments;
string[] arguments = null;
if (commandAndArguments.Contains(' '))
{
command = command.Remove(command.IndexOf(' '));
if (!commands.ContainsKey(command)) throw new ArgumentException();
string[] argumentsSplit = commandAndArguments.Remove(command.Length).Split(' ');
List<string> argumentsList = new List<string>();
for (int i = 0; i < argumentsSplit.Length; i++)
{
if (argumentsSplit[i].Contains('"') && !argumentsSplit[i].EndsWith('"'))
{
StringBuilder quoteBuilder = new StringBuilder();
do
{
quoteBuilder.Append(' ');
quoteBuilder.Append(argumentsSplit[i]);
i++;
if (i >= argumentsSplit.Length)
{
throw new ArgumentException();
}
} while (!argumentsSplit[i].Contains('"'));
quoteBuilder.Append(' ');
quoteBuilder.Append(argumentsSplit[i]);
argumentsList.Add(quoteBuilder.ToString().Trim());
}
else
{
argumentsList.Add(argumentsSplit[i]);
}
}
arguments = argumentsList.ToArray();
}
if (!commands.ContainsKey(command)) throw new ArgumentException();
commands[command].Run(arguments);
}
}
}

View File

@ -0,0 +1,11 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace RecrownedAthenaeum.Tools.CommandProcessor
{
interface ICommandEngineCommand
{
void Run(string[] arguments);
}
}

View File

@ -0,0 +1,17 @@
using RecrownedAthenaeum.Tools.CommandProcessor;
using System;
using System.Collections.Generic;
using System.Text;
namespace RecrownedAthenaeum.Tools.TextureAtlasTools
{
class TexturePackerCommand : ICommandEngineCommand
{
public void Run(string[] arguments)
{
throw new NotImplementedException();
}
}
}

View File

@ -1,4 +1,5 @@
using RecrownedAthenaeum.Tools.CommandProcessor;
using RecrownedAthenaeum.Tools.TextureAtlasTools;
using System;
using System.Reflection;
@ -11,6 +12,7 @@ namespace RecrownedAthenaeum.Tools
Console.WriteLine("Recrowned Athenaeum Console Tools version " + Assembly.GetExecutingAssembly().GetName().Version.ToString());
CommandEngine ce = new CommandEngine();
ce.commands.Add("TexturePacker", new TexturePackerCommand());
ce.Run();
}
}