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;