-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCli.cs
More file actions
55 lines (54 loc) · 1.8 KB
/
Cli.cs
File metadata and controls
55 lines (54 loc) · 1.8 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
using Basic.Util;
namespace Basic;
public class Cli
{
public static async Task Interpreter()
{
Log.Out("");
while (true)
{
try
{
Log.Alert("\nPlease enter a command or 'help'. Commands are not case sensitive");
var command = Console.ReadLine().Trim();
var commandArr = SplitArgs(command);
var verb = commandArr[0].ToLower();
if (!string.IsNullOrEmpty(verb))
{
var cmd = Command.commands
.Where(p => p.Key.Equals(verb, StringComparison.CurrentCultureIgnoreCase))
.Select(p => p.Value.Command)
.Single();
await cmd(commandArr);
}
}
catch (Exception)
{
Log.Error("Invalid command. Please type 'help' for more information.");
}
}
}
private static string[] SplitArgs(string arg)
{
var quotecount = arg.Count(x => x == '"');
if (quotecount % 2 != 0)
{
Log.Alert("Your command contains an uneven number of quotes. Was that intended?");
}
var segments = arg.Split('"', StringSplitOptions.RemoveEmptyEntries);
var elements = new List<string>();
for (var i = 0; i < segments.Length; i++)
{
if (i % 2 == 0)
{
var parts = segments[i].Split(Array.Empty<char>(), StringSplitOptions.RemoveEmptyEntries);
elements.AddRange(parts.Select(ps => ps.Trim()));
}
else
{
elements.Add(segments[i].Trim());
}
}
return [.. elements]; // fancy way of writing `return elements.ToString();`
}
}