public static bool TrySearch(IDataModel data, ModelDelta changeToken, string originalFormat, out ArrayRun self, Func <IFormattedRun, bool> runFilter = null) { self = null; var format = originalFormat; var allowPointersToEntries = format.StartsWith(AnchorStart.ToString()); if (allowPointersToEntries) { format = format.Substring(1); } var closeArray = format.LastIndexOf(ArrayEnd.ToString()); if (!format.StartsWith(ArrayStart.ToString()) || closeArray == -1) { throw new ArrayRunParseException($"Array Content must be wrapped in {ArrayStart}{ArrayEnd}"); } var segments = format.Substring(1, closeArray - 1); var length = format.Substring(closeArray + 1); var elementContent = ParseSegments(segments, data); if (elementContent.Count == 0) { return(false); } var elementLength = elementContent.Sum(e => e.Length); using (ModelCacheScope.CreateScope(data)) { if (string.IsNullOrEmpty(length)) { var bestAddress = StandardSearch(data, elementContent, elementLength, out int bestLength, runFilter); if (bestAddress == Pointer.NULL) { return(false); } self = new ArrayRun(data, originalFormat + bestLength, string.Empty, bestAddress, bestLength, elementContent, data.GetNextRun(bestAddress).PointerSources, null); } else { var bestAddress = KnownLengthSearch(data, elementContent, elementLength, length, out int bestLength, runFilter); if (bestAddress == Pointer.NULL) { return(false); } var lengthFromAnchor = int.TryParse(length, out var _) ? string.Empty : length; self = new ArrayRun(data, originalFormat, lengthFromAnchor, bestAddress, bestLength, elementContent, data.GetNextRun(bestAddress).PointerSources, null); } } if (allowPointersToEntries) { self = self.AddSourcesPointingWithinArray(changeToken); } return(true); }
public static ErrorInfo TryParse(IDataModel data, string format, int start, IReadOnlyList <int> pointerSources, out ArrayRun self) { try { using (ModelCacheScope.CreateScope(data)) { self = new ArrayRun(data, format, start, pointerSources); } } catch (ArrayRunParseException e) { self = null; return(new ErrorInfo(e.Message)); } return(ErrorInfo.NoError); }