57 lines
1.7 KiB
C#
57 lines
1.7 KiB
C#
|
using System.Text.RegularExpressions;
|
||
|
|
||
|
using MultiversalDiplomacy.Model;
|
||
|
|
||
|
namespace MultiversalDiplomacy.Script;
|
||
|
|
||
|
public class ValidatedOrdersScriptHandler(World world, bool strict = false) : IScriptHandler
|
||
|
{
|
||
|
public string Prompt => "valid> ";
|
||
|
|
||
|
public World World { get; private set; } = world;
|
||
|
|
||
|
/// <summary>
|
||
|
/// Whether unsuccessful commands should terminate the script.
|
||
|
/// </summary>
|
||
|
public bool Strict { get; } = strict;
|
||
|
|
||
|
public IScriptHandler? HandleInput(string input)
|
||
|
{
|
||
|
var args = input.Split(' ', StringSplitOptions.RemoveEmptyEntries);
|
||
|
if (args.Length == 0)
|
||
|
{
|
||
|
return this;
|
||
|
}
|
||
|
|
||
|
var command = args[0];
|
||
|
switch (command)
|
||
|
{
|
||
|
case "assert" when args.Length == 1:
|
||
|
Console.WriteLine("Usage:");
|
||
|
break;
|
||
|
|
||
|
case "assert":
|
||
|
string assertion = input["assert ".Length..];
|
||
|
OrderRegex re = new(World);
|
||
|
Regex prov = new($"{re.Province} (.*)");
|
||
|
Match match = prov.Match(assertion);
|
||
|
if (!match.Success) {
|
||
|
Console.WriteLine($"Could not parse province from {assertion}");
|
||
|
return Strict ? null : this;
|
||
|
}
|
||
|
// TODO look up order once orders are validated and adjudicated
|
||
|
Console.WriteLine("Order lookup not implemented yet");
|
||
|
return null;
|
||
|
|
||
|
default:
|
||
|
// noop on comments that begin with #
|
||
|
if (command.StartsWith('#')) break;
|
||
|
Console.WriteLine($"Unrecognized command: {command}");
|
||
|
if (Strict) return null;
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
return this;
|
||
|
}
|
||
|
}
|