diff --git a/ShiftOS_TheReturn/CommandParser.cs b/ShiftOS_TheReturn/CommandParser.cs index 182ff53..7a190df 100644 --- a/ShiftOS_TheReturn/CommandParser.cs +++ b/ShiftOS_TheReturn/CommandParser.cs @@ -10,52 +10,83 @@ using System.Text.RegularExpressions; using System.Threading.Tasks; using System.Windows.Forms; -namespace ShiftOS.Engine { - public static class CurrentCommandParser { +namespace ShiftOS.Engine +{ + /// + /// Static abstraction layer for the current command parser + /// + public static class CurrentCommandParser + { + /// + /// The current parser + /// public static CommandParser parser; } - public class CommandParser { + /// + /// Provides functionality for parsing a Terminal command string + /// + public sealed class CommandParser + { public IList parts = new List(); - public void AddPart(CommandFormat part) { + /// + /// Adds a command format to the parser + /// + /// The format to add + public void AddPart(CommandFormat part) + { parts.Add(part); } - public void ImportPart(IList parts) { + /// + /// Imports the command parser formats from a list. + /// + /// The list of formats. + public void ImportPart(IList parts) + { this.parts = parts; } - public string Save() { - JArray data = new JArray(); - foreach(CommandFormat part in parts) { - CFValue val = new CFValue(part); - JObject obj = new JObject(); - obj["type"] = new JValue(val.type); - obj["text"] = new JValue(val.text); - data.Add(obj); - } - - return data.ToString(); + /// + /// Saves the parser to a JSON string. + /// + /// + public string Save() + { + return JsonConvert.SerializeObject(parts, Formatting.Indented); } - public static CommandParser Load(string val) { + /// + /// Loads a new from a file. + /// + /// The file to load + /// The parser constructed from the file + public static CommandParser Load(string val) + { CommandParser parser = new CommandParser(); JArray data = JArray.Parse(val); - IList values = data.Select(obj => new CFValue ( + IList values = data.Select(obj => new CFValue( (string)obj["type"], (string)obj["text"] )).ToList(); - foreach(CFValue value in values) { + foreach (CFValue value in values) + { parser.AddPart(value.GetCommandFormat()); } return parser; } - public KeyValuePair, Dictionary> ParseCommand(string cdd) { + /// + /// Parses a command string. + /// + /// The command string to parse. + /// The parsed command, ready to be invoked. + public KeyValuePair, Dictionary> ParseCommand(string cdd) + { string command = ""; string ns = ""; Dictionary arguments = new Dictionary(); @@ -69,12 +100,17 @@ namespace ShiftOS.Engine { string syntaxError = ""; - for (int ii = 0; ii < parts.Count; ii++) { + for (int ii = 0; ii < parts.Count; ii++) + { CommandFormat part = parts[ii]; - if (part is CommandFormatMarker) { - if (part is CommandFormatCommand) { + if (part is CommandFormatMarker) + { + if (part is CommandFormatCommand) + { commandPos = ii; - } else if (part is CommandFormatValue) { + } + else if (part is CommandFormatValue) + { if (firstValuePos > -1) lastValuePos = ii; else @@ -87,9 +123,11 @@ namespace ShiftOS.Engine { string currentArgument = ""; int help = -1; - while (position < text.Length) { + while (position < text.Length) + { - if (i >= parts.Count) { + if (i >= parts.Count) + { position = text.Length; command = "+FALSE+"; i = 0; @@ -104,17 +142,25 @@ namespace ShiftOS.Engine { // COMMAND text[ --] ARGUMENT VALUE text[ --] ARGUMENT VALUE // COMMAND text[{] ARGUMENT text[=] VALUE text[, ] ARGUMENT text[=] VALUE text[}] - if (part is CommandFormatMarker) { - if (part is CommandFormatNamespace) { + if (part is CommandFormatMarker) + { + if (part is CommandFormatNamespace) + { ns = res; help = -1; - }else if (part is CommandFormatCommand) { + } + else if (part is CommandFormatCommand) + { command = res; help = -1; - } else if (part is CommandFormatArgument) { + } + else if (part is CommandFormatArgument) + { currentArgument = res; help = -1; - } else if (part is CommandFormatValue) { + } + else if (part is CommandFormatValue) + { arguments[currentArgument] = string.Join("", res.Split('"')); if (i == firstValuePos) @@ -124,30 +170,40 @@ namespace ShiftOS.Engine { } } - if (res == "+FALSE+") { - if (help > -1) { + if (res == "+FALSE+") + { + if (help > -1) + { i = help; - if (i >= parts.Count) { + if (i >= parts.Count) + { position = text.Length; command = "+FALSE+"; } - } else { + } + else + { position = text.Length; syntaxError = "Syntax Error"; command = "+FALSE+"; } help = -1; - } else { + } + else + { position += res.Length; } i++; } - if (command == "+FALSE+") { + if (command == "+FALSE+") + { //lblExampleCommand.Text = "Syntax Error"; return new KeyValuePair, Dictionary>(); - } else { + } + else + { /*string argvs = "{"; foreach (KeyValuePair entry in arguments) { @@ -157,47 +213,68 @@ namespace ShiftOS.Engine { argvs += "}"; lblExampleCommand.Text = command + argvs;*/ - return new KeyValuePair, Dictionary> (new KeyValuePair(ns, command), arguments); + return new KeyValuePair, Dictionary>(new KeyValuePair(ns, command), arguments); } } } - public class CFValue { + public class CFValue + { public string type { get; set; } + public string text { get; set; } - public CFValue(string type, string text) { + public CFValue(string type, string text) + { this.type = type; this.text = text; } - public CFValue(CommandFormat format) { + public CFValue(CommandFormat format) + { type = ""; text = ""; - if(format is CommandFormatText) { - text = ((CommandFormatText) format).str; - if(format is CommandFormatOptionalText) { + if (format is CommandFormatText) + { + text = ((CommandFormatText)format).str; + if (format is CommandFormatOptionalText) + { type = "optionalText"; - }else if (format is CommandFormatRegex) { + } + else if (format is CommandFormatRegex) + { type = "regexText"; - }else { + } + else + { type = "text"; } - }else if (format is CommandFormatMarker) { - if (format is CommandFormatNamespace) { + } + else if (format is CommandFormatMarker) + { + if (format is CommandFormatNamespace) + { type = "namespace"; - } else if (format is CommandFormatCommand) { + } + else if (format is CommandFormatCommand) + { type = "command"; - } else if (format is CommandFormatArgument) { + } + else if (format is CommandFormatArgument) + { type = "argument"; - } else if (format is CommandFormatValue) { + } + else if (format is CommandFormatValue) + { type = "value"; } } } - public CommandFormat GetCommandFormat() { // TODO update with better code - switch (type) { + public CommandFormat GetCommandFormat() + { // TODO update with better code + switch (type) + { case "text": return new CommandFormatText(text); case "optionalText": @@ -220,27 +297,33 @@ namespace ShiftOS.Engine { } - public interface CommandFormat { + public interface CommandFormat + { string CheckValidity(string check); Control Draw(); } - public class CommandFormatText : CommandFormat { + public class CommandFormatText : CommandFormat + { public string str = ""; TextBox textBox; - public CommandFormatText() { + public CommandFormatText() + { } - public CommandFormatText(string str) { + public CommandFormatText(string str) + { this.str = str; } - public virtual string CheckValidity(string check) { + public virtual string CheckValidity(string check) + { return check.StartsWith(str) ? str : "+FALSE+"; } - public Control Draw() { + public Control Draw() + { textBox = new TextBox(); textBox.TextChanged += new EventHandler(TextChanged); textBox.Location = new Point(0, 0); @@ -249,49 +332,65 @@ namespace ShiftOS.Engine { return textBox; } - void TextChanged(object sender, EventArgs e) { + void TextChanged(object sender, EventArgs e) + { str = textBox.Text; } } - public class CommandFormatOptionalText : CommandFormatText { - public CommandFormatOptionalText() : base() { + public class CommandFormatOptionalText : CommandFormatText + { + public CommandFormatOptionalText() : base() + { } - public CommandFormatOptionalText(string str) : base(str) { + public CommandFormatOptionalText(string str) : base(str) + { } - public override string CheckValidity(string check) { + public override string CheckValidity(string check) + { return check.StartsWith(str) ? str : ""; } } - public class CommandFormatRegex : CommandFormatText { - public CommandFormatRegex() : base() { + public class CommandFormatRegex : CommandFormatText + { + public CommandFormatRegex() : base() + { } - public CommandFormatRegex(string str) : base(str) { + public CommandFormatRegex(string str) : base(str) + { } - public override string CheckValidity(string check) { + public override string CheckValidity(string check) + { Match match = (new Regex("^" + str)).Match(check); return match.Success ? match.Value : "+FALSE+"; } } - public class CommandFormatMarker : CommandFormat { + public class CommandFormatMarker : CommandFormat + { protected string str; Button button; - public CommandFormatMarker() { + public CommandFormatMarker() + { } - public virtual string CheckValidity(string check) { + public virtual string CheckValidity(string check) + { string res = string.Empty; string alphanumeric = "QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm"; // not using regex for performance reasons - foreach (char c in check) { - if (alphanumeric.IndexOf(c) > -1) { + foreach (char c in check) + { + if (alphanumeric.IndexOf(c) > -1) + { res += c; - } else { + } + else + { break; } } @@ -299,7 +398,8 @@ namespace ShiftOS.Engine { return res; } - public virtual Control Draw() { + public virtual Control Draw() + { button = new Button(); button.Location = new Point(0, 0); button.Text = "Marker"; @@ -308,56 +408,72 @@ namespace ShiftOS.Engine { } } - public class CommandFormatCommand : CommandFormatMarker { - public override Control Draw() { + public class CommandFormatCommand : CommandFormatMarker + { + public override Control Draw() + { Button draw = (Button)base.Draw(); draw.Text = "Command"; return draw; } } - public class CommandFormatNamespace : CommandFormatMarker { - public override Control Draw() { + public class CommandFormatNamespace : CommandFormatMarker + { + public override Control Draw() + { Button draw = (Button)base.Draw(); draw.Text = "Namespace"; return draw; } } - public class CommandFormatArgument : CommandFormatMarker { - public override Control Draw() { + public class CommandFormatArgument : CommandFormatMarker + { + public override Control Draw() + { Button draw = (Button)base.Draw(); draw.Text = "Argument"; return draw; } } - public class CommandFormatValue : CommandFormatMarker { - public override string CheckValidity(string cd) { + public class CommandFormatValue : CommandFormatMarker + { + public override string CheckValidity(string cd) + { string res = string.Empty; var check = ""; bool done = false; - if (cd.StartsWith("\"")) { + if (cd.StartsWith("\"")) + { check = cd.Substring(1); - foreach (char c in check) { - if (c != '"') { + foreach (char c in check) + { + if (c != '"') + { res += c; - } else { + } + else + { done = true; res = "\"" + res + "\""; break; } } - } else{ + } + else + { res = base.CheckValidity(cd); done = true; } return done ? res : "+FALSE+"; } - public override Control Draw() { + public override Control Draw() + { Button draw = (Button)base.Draw(); draw.Text = "\"Value\""; return draw;