public override void Parse(IMessage message, string @string, ParserOptions parserOptions) { if (parserOptions is null) { throw new ArgumentNullException(nameof(parserOptions)); } var messageIter = new Util.MessageIterator(message, "MSH", true); FilterIterator.IPredicate segmentsOnly = new AnonymousClassPredicate(this); var segmentIter = new FilterIterator(messageIter, segmentsOnly); var segments = Split(@string, SegDelim); var encodingChars = GetEncodingChars(@string); var delimiter = '|'; for (var i = 0; i < segments.Length; i++) { // get rid of any leading whitespace characters ... if (segments[i] != null && segments[i].Length > 0 && char.IsWhiteSpace(segments[i][0])) { segments[i] = StripLeadingWhitespace(segments[i]); } // sometimes people put extra segment delimiters at end of msg ... if (segments[i] != null && segments[i].Length >= 3) { var name = segments[i].Substring(0, 3 - 0); if (i == 0) { name = segments[i].Substring(0, 3); delimiter = segments[i][3]; } else { name = segments[i].IndexOf(delimiter) >= 0 ? segments[i].Substring(0, segments[i].IndexOf(delimiter)) : segments[i]; } Log.Debug("Parsing segment " + name); messageIter.Direction = name; FilterIterator.IPredicate byDirection = new AnonymousClassPredicate1(name, this); var dirIter = new FilterIterator(segmentIter, byDirection); if (dirIter.MoveNext()) { Parse((ISegment)dirIter.Current, segments[i], encodingChars, parserOptions); } } } }
/// <inheritdoc /> public IEnumerator <TElement> GetEnumerator() { lock (_originSet) { if (_elementCache != null) { return(_elementCache.GetEnumerator()); } // Copy all matching items into the cache _elementCache = new LinearList <TElement>(); using (FilterIterator itr = new FilterIterator(_originSet.GetEnumerator(), _wherePredicate)) { while (itr.MoveNext()) { _elementCache.Add(itr.Current); } } return(_elementCache.GetEnumerator()); } }
/// <summary> Parses a message string and returns the corresponding Message /// object. Unexpected segments added at the end of their group. /// /// </summary> /// <throws> HL7Exception if the message is not correctly formatted. </throws> /// <throws> EncodingNotSupportedException if the message encoded </throws> /// <summary> is not supported by this parser. /// </summary> protected internal override IMessage DoParse(System.String message, System.String version) { //try to instantiate a message object of the right class MessageStructure structure = GetStructure(message); IMessage m = InstantiateMessage(structure.messageStructure, version, structure.explicitlyDefined); //MessagePointer ptr = new MessagePointer(this, m, getEncodingChars(message)); MessageIterator messageIter = new MessageIterator(m, "MSH", true); FilterIterator.IPredicate segmentsOnly = new AnonymousClassPredicate(this); FilterIterator segmentIter = new FilterIterator(messageIter, segmentsOnly); System.String[] segments = Split(message, segDelim); EncodingCharacters encodingChars = GetEncodingChars(message); for (int i = 0; i < segments.Length; i++) { //get rid of any leading whitespace characters ... if (segments[i] != null && segments[i].Length > 0 && System.Char.IsWhiteSpace(segments[i][0])) { segments[i] = StripLeadingWhitespace(segments[i]); } //sometimes people put extra segment delimiters at end of msg ... if (segments[i] != null && segments[i].Length >= 3) { System.String name = segments[i].Substring(0, (3) - (0)); log.Debug("Parsing segment " + name); messageIter.Direction = name; FilterIterator.IPredicate byDirection = new AnonymousClassPredicate1(name, this); FilterIterator dirIter = new FilterIterator(segmentIter, byDirection); if (dirIter.MoveNext()) { Parse((ISegment)dirIter.Current, segments[i], encodingChars); } } } return(m); }