public override bool Write(IDataModel model, ModelDelta token, int start, ref string data) { var parts = data.Split(new[] { "(", ")", " " }, StringSplitOptions.RemoveEmptyEntries).ToList(); TableStreamRun.Recombine(parts, "\"", "\""); data = string.Empty; if (parts.Count != VisibleElementCount) { return(false); } int bitOffset = 0; int partIndex = 0; bool anyChanges = false; for (int i = 0; i < Elements.Count; i++) { if (string.IsNullOrEmpty(Elements[i].Name)) { // Unnamed segments. I should increment, and bitOffset should increase, but the value should change to zero. anyChanges |= Elements[i].Write(model, token, start, bitOffset, 0); partIndex -= 1; } else if (!string.IsNullOrEmpty(Elements[i].SourceName)) { if (ArrayRunEnumSegment.TryParse(Elements[i].SourceName, model, parts[partIndex], out int value)) { anyChanges |= Elements[i].Write(model, token, start, bitOffset, value); } } else if (Elements[i].BitWidth == 1) { if (bool.TryParse(parts[partIndex], out bool value)) { anyChanges |= Elements[i].Write(model, token, start, bitOffset, value ? 1 : 0); } } else { if (int.TryParse(parts[partIndex], out int value)) { anyChanges |= Elements[i].Write(model, token, start, bitOffset, value); } } partIndex += 1; bitOffset += Elements[i].BitWidth; } var remainingBits = Length * 8 - bitOffset; if (remainingBits > 0) { anyChanges |= new TupleSegment(string.Empty, remainingBits).Write(model, token, start, bitOffset, 0); } return(anyChanges); }
public void Visit(DataFormats.Tuple tuple, byte data) { Result = CurrentText.EndsWith(")"); if (CurrentText.EndsWith(" ")) { var tokens = CurrentText.Split(new[] { ' ', '(', ')' }, StringSplitOptions.RemoveEmptyEntries).ToList(); TableStreamRun.Recombine(tokens, "\"", "\""); if (tokens.Count == tuple.Model.VisibleElementCount) { Result = true; } } if (Result) { tuple.Model.Write(Model, CurrentChange, memoryLocation, CurrentText); NewDataIndex = memoryLocation + tuple.Length; } }
public IReadOnlyList <AutocompleteItem> GetAutocomplete(IDataModel model, string text) { var tupleTokens = text.Split(" ").ToList(); TableStreamRun.Recombine(tupleTokens, "\"", "\""); if (tupleTokens[0].StartsWith("(")) { tupleTokens[0] = tupleTokens[0].Substring(1); } var visibleTupleElements = Elements.Where(element => !string.IsNullOrEmpty(element.Name)).ToList(); var optionToken = tupleTokens.Last(); tupleTokens = tupleTokens.Take(tupleTokens.Count - 1).ToList(); if (visibleTupleElements.Count > tupleTokens.Count) { var tupleToken = visibleTupleElements[tupleTokens.Count]; if (optionToken.StartsWith("\"")) { optionToken = optionToken.Substring(1); } if (optionToken.EndsWith("\"")) { optionToken = optionToken.Substring(0, optionToken.Length - 1); } if (!string.IsNullOrEmpty(tupleToken.SourceName)) { var optionText = ArrayRunEnumSegment.GetOptions(model, tupleToken.SourceName).Where(option => option.MatchesPartial(optionToken)); return(CreateTupleEnumAutocompleteOptions(tupleTokens, optionText)); } else if (tupleToken.BitWidth == 1) { var optionText = new[] { "false", "true" }.Where(option => option.MatchesPartial(optionToken)); return(CreateTupleEnumAutocompleteOptions(tupleTokens, optionText)); } } return(null); }