public Query(string input) { OriginalInput = input; OriginalInputTrim = OriginalInput.Trim(); IsHelp = input == "?" || string.Equals(input, "help", StringComparison.OrdinalIgnoreCase); Structure = StructureParser.Parse(input); }
public T TryGetStructure <T>(int index) { if (index < 0 || index >= Count) { return(default(T)); } return(StructureParser.TryGetStructure <T>(Parts[index])); }
private Prefix TryMatch(string query, string prefix) { if (query.Length > prefix.Length && query.StartsWith(prefix, StringComparison.OrdinalIgnoreCase)) { var remainderString = query.Substring(prefix.Length); var parsedRemainder = StructureParser.Parse(remainderString); return(new Prefix(PrefixKind, prefix, remainderString, parsedRemainder)); } return(null); }
public IReadOnlyList <T> GetStructuresOfType <T>() where T : IStructureParser { List <T> result = new List <T>(); foreach (var part in Parts) { var instance = StructureParser.TryGetStructure <T>(part); if (instance != null) { result.Add(instance); } } return(result); }
private static Double TryParseUnitValue(string query, int start, int length) { var parsed = StructureParser.Parse(query.Substring(start, length)); var number = StructureParser.TryGetStructure <Double>(parsed); if (number != null) { if (StructureParser.TryGetStructure <Integer>(parsed) is Integer i && i.Kind == IntegerKind.Hexadecimal) { // don't allow hex numbers with units return(null); } } return(number); }
public object TryParse(string query) { if (query.IndexOf(separatorCharArray[0]) != -1) { var parts = query.Split(separatorCharArray, StringSplitOptions.RemoveEmptyEntries); if (parts.Length == 0) { return(null); } var parsed = parts.Select(p => StructureParser.Parse(p)).ToArray(); if (parsed.Any(p => p == null)) { return(null); } return(new SeparatedList(parsed, SeparatorChar)); } return(null); }
public object GetResult(Query query) { if (query.IsHelp) { return(HelpTable ( ("color", "Named color palette"), ("red", "Named color"), ("#FFC0CB", "Hex color"), ("rgb 23 145 175", "RGB"), ("rgb(rnd*255, rnd*255, rnd*255)", "Random RGB color") )); } var input = query.OriginalInputTrim; if (string.Equals(input, "color", StringComparison.OrdinalIgnoreCase) || string.Equals(input, "colors", StringComparison.OrdinalIgnoreCase)) { return(RenderColorTable()); } string knownColor = null; if (knownColors.TryGetValue(input.Trim(), out knownColor)) { return(GetResultFromHexString(knownColor)); } if (query.Structure == null) { return(null); } SeparatedList list = query.TryGetStructure <SeparatedList>(); if (list == null) { var invocation = query.TryGetStructure <Invocation>(); if (invocation != null && string.Equals(invocation.Prefix, "rgb", StringComparison.OrdinalIgnoreCase)) { list = StructureParser.TryGetStructure <SeparatedList>(invocation.ArgumentListParsed); if (list != null && list.Count != 3) { list = null; } } } if (list != null && (list.Count == 3 || (list.Count == 4 && (list.TryGetStructure <Keyword>(0) == "rgb" || list.TryGetStructure <Keyword>(3) == "rgb")))) { var intList = list.GetStructuresOfType <Integer>(); if (intList.Count == 3) { var r = intList[0].Value; var g = intList[1].Value; var b = intList[2].Value; if (r >= 0 && r < 256 && g >= 0 && g < 256 && b >= 0 && b < 256) { return(GetResult((int)r, (int)g, (int)b)); } } } var hashPrefix = query.TryGetStructure <Prefix>(); if (hashPrefix != null && hashPrefix.PrefixString == "#") { var remainderString = hashPrefix.RemainderString; if (remainderString.Length == 3 || remainderString.Length == 6 || remainderString.Length == 8) { var integer = StructureParser.TryGetStructure <Integer>(hashPrefix.Remainder); if (integer != null) { return(GetResultFromHexString(remainderString)); } } } return(null); }
public T TryGetStructure <T>() { return(StructureParser.TryGetStructure <T>(Structure)); }