More console progress

This commit is contained in:
Matt Thorson 2020-06-20 14:03:45 -07:00
parent 9de0160957
commit 75364ade37
2 changed files with 83 additions and 23 deletions

View File

@ -66,6 +66,34 @@ namespace Strawberry
return current >= startDelay && (current - startDelay) % (interval * 2) >= interval; return current >= startDelay && (current - startDelay) % (interval * 2) >= interval;
} }
static public String StringArgs(String str, Object[] args)
{
for (let i < args.Count)
{
if (args[i] is delegate void(String))
{
let del = args[i] as delegate void(String);
let argStr = scope:: String();
del(argStr);
args[i] = argStr;
}
}
for (let i < args.Count)
{
String arg = scope String();
String num = scope String("{x}");
i.ToString(arg);
num.Replace("x", arg);
arg.Clear();
args[i].ToString(arg);
str.Replace(num, arg);
}
return str;
}
[Inline] [Inline]
static public void Log() static public void Log()
{ {
@ -88,23 +116,7 @@ namespace Strawberry
Debug.WriteLine(string); Debug.WriteLine(string);
} }
static private String StringArgs(String str, Object[] args) [Inline]
{
for (let i < args.Count)
{
String arg = scope String();
String num = scope String("{x}");
i.ToString(arg);
num.Replace("x", arg);
arg.Clear();
args[i].ToString(arg);
str.Replace(num, arg);
}
return str;
}
static public void Log(StringView str, params Object[] args) static public void Log(StringView str, params Object[] args)
{ {
let string = StringArgs(scope String(str), args); let string = StringArgs(scope String(str), args);

View File

@ -5,6 +5,7 @@ using Strawberry;
namespace Strawberry namespace Strawberry
{ {
[AttributeUsage(.Method, .AlwaysIncludeTarget | .ReflectAttribute)]
public struct CommandAttribute : Attribute public struct CommandAttribute : Attribute
{ {
public String Name; public String Name;
@ -48,7 +49,6 @@ namespace Strawberry
commands.Add(attr.Value.Name, new CommandInfo(method, attr.Value)); commands.Add(attr.Value.Name, new CommandInfo(method, attr.Value));
} }
} }
Calc.Log(commands.Count);
} }
static public void Dispose() static public void Dispose()
@ -57,7 +57,9 @@ namespace Strawberry
delete entry; delete entry;
DeleteContainerAndItems!(commandHistory); DeleteContainerAndItems!(commandHistory);
DeleteContainerAndItems!(messages); DeleteContainerAndItems!(messages);
DeleteDictionaryAndKeysAndItems!(commands); for (let c in commands.Values)
delete c;
delete commands;
} }
static public bool Enabled static public bool Enabled
@ -87,7 +89,6 @@ namespace Strawberry
Log(string); Log(string);
} }
[AlwaysInclude]
[Reflect] [Reflect]
[Command("clear", "Clears the console window")] [Command("clear", "Clears the console window")]
static public void Clear() static public void Clear()
@ -123,12 +124,14 @@ namespace Strawberry
{ {
let list = String.StackSplit!(line, ' '); let list = String.StackSplit!(line, ' ');
list.RemoveAll(scope => String.IsNullOrWhiteSpace); list.RemoveAll(scope => String.IsNullOrWhiteSpace);
Calc.Log("hey {0}");
if (commands.ContainsKey(list[0])) if (commands.ContainsKey(list[0]))
{ {
Log(line); Log(line);
//Do it let args = scope String[list.Count - 1];
for (let i < args.Count)
args[i] = list[i + 1];
commands[list[0]].Call(args);
} }
else else
Log("Command '{0}' not recognized.", list[0]); Log("Command '{0}' not recognized.", list[0]);
@ -170,13 +173,58 @@ namespace Strawberry
private class CommandInfo private class CommandInfo
{ {
public delegate void(String[]) Action ~ delete _;
public String Help; public String Help;
public String Usage ~ delete _; public String Usage ~ delete _;
public MethodInfo Method;
public this(MethodInfo method, CommandAttribute attr) public this(MethodInfo method, CommandAttribute attr)
{ {
Help = attr.Help; Help = attr.Help;
Method = method;
}
public void Call(String[] args)
{
let objs = scope Object[Method.ParamCount];
for (let i < objs.Count)
{
if (i < args.Count)
objs[i] = Convert(args[i], Method.GetParamType(i));
else
objs[i] = Method.GetParamType(i).CreateValueDefault();
}
Method.Invoke(null, objs);
}
}
static private Object Convert(String str, Type type)
{
switch (type)
{
case typeof(StringView):
return str;
case typeof(int):
return int.Parse(str).Value;
case typeof(float):
return float.Parse(str).Value;
case typeof(bool):
return bool.Parse(str).Value;
case typeof(String):
Runtime.FatalError("String arguments not supported in commands. Use StringView instead.");
default:
{
let name = scope String();
type.GetName(name);
let error = Calc.StringArgs("{0} type arguments not supported in commands.", scope Object[] { name });
Runtime.FatalError(error);
}
} }
} }
} }