public static async Task <TextCursor> ParseText(StreamText text, TextSpan span, TextParser parser) { var result = parser.Parse(text, span); if (NeedsMoreInput(text, span, result)) { var streamText = await text.GetNext(span).ConfigureAwait(false); var textSpan = new TextSpan(0, streamText.Length); result = parser.Parse(streamText, textSpan); while (NeedsMoreInput(streamText, textSpan, result)) { streamText = await streamText.Reader.Next(streamText).ConfigureAwait(false); textSpan = new TextSpan(0, streamText.Length); result = parser.Parse(streamText, textSpan); } if (result.HasResult) { return(new StreamTextCursor(streamText, result.Result, result.Next, parser)); } } if (result.HasResult) { return(new StreamTextCursor(text, result.Result, result.Next, parser)); } return(new EmptyTextCursor(text, span)); }
public async Task Should_parse_the_two_segments_in_a_row() { const string message = @"MSH|^~\&|LIFTLAB||UBERMED||201701131234||ORU^R01|K113|P| MSH|^~\&|LIFTLAB2||UBERMED2||201701131234||ORU^R01|K113|P|"; using (var stream = new StringReader(message)) { StreamText text = await new TextReaderStreamTextReader(stream, Environment.NewLine).Text; ParsedResult <HL7Entity> result = await Parser.ParseAsync(text, new TextSpan(0, text.Length)); MSHSegment msh = null; Assert.IsTrue(result.TryGetEntity(0, out msh)); Assert.IsNotNull(msh); Assert.IsNotNull(msh.SendingApplication); Assert.IsTrue(msh.SendingApplication.IsPresent); Assert.IsTrue(msh.SendingApplication.HasValue); Assert.That(msh.SendingApplication.Value, Is.EqualTo("LIFTLAB")); result = await result.NextAsync(Parser); Assert.IsTrue(result.TryGetEntity(0, out msh)); Assert.IsNotNull(msh); Assert.IsNotNull(msh.SendingApplication); Assert.IsTrue(msh.SendingApplication.IsPresent); Assert.IsTrue(msh.SendingApplication.HasValue); Assert.That(msh.SendingApplication.Value, Is.EqualTo("LIFTLAB2")); } }
public StreamTextCursor(StreamText text, TextSpan valueSpan, TextSpan nextSpan, TextParser parser) { _text = text; _valueSpan = valueSpan; _nextSpan = nextSpan; _parser = parser; }
public override ParsedResult <TSchema> Parse(ParseText text, TextSpan span) { if (span.Length == 0) { throw new MacheteParserException("The body was empty"); } int i = span.Start; for (; i < span.End; i++) { if (!char.IsWhiteSpace(text[i])) { break; } } if (i + 8 > span.End) { throw new MacheteParserException("The body must contain at least 8 characters"); } if (text[i] != 'M' || text[i + 1] != 'S' || text[i + 2] != 'H') { throw new MacheteParserException("The body must start with an MSH segment"); } var settings = GetHL7Settings(text, TextSpan.FromBounds(i, span.End)); var streamText = new StreamText(text, null); var textCursor = new StreamTextCursor(streamText, TextSpan.FromBounds(i, span.End), TextSpan.FromBounds(span.End, span.End), _messageParser); return(new HL7ParsedSlice <TSchema>(Schema, settings, textCursor)); }
public EmptyParseResult(ISchema <TSchema> schema, IEntityParser <TSchema> parser, StreamText text, TextSpan remainingSpan) { Schema = schema; Parser = parser; RemainingText = text; RemainingSpan = remainingSpan; }
public StreamTextCursor(StreamText text, TextSpan valueSpan, TextSpan nextSpan, ITextParser parser) { _text = text; _valueSpan = valueSpan; _nextSpan = nextSpan; _parser = parser; _next = null; _nextComputed = false; _value = null; _valueComputed = false; }
public override async Task <ParseResult <TSchema> > ParseAsync(StreamText text, TextSpan span) { var result = await StreamTextCursor.ParseText(text, span, _messageParser); if (!result.HasCurrent) { return(new EmptyParseResult <TSchema>(Schema, this, text, result.NextSpan)); } var settings = ParseSettings(result.InputText, result.CurrentSpan); return(new HL7ParseResult <TSchema>(Schema, this, settings, result)); }
public override async Task <ParsedResult <TSchema> > ParseAsync(StreamText text, TextSpan span) { var result = await StreamTextCursor.ParseText(text, span, _messageParser); if (!result.HasValue) { throw new MacheteParserException("A valid HL7 message was not found."); } var settings = GetHL7Settings(result.SourceText, result.Span); return(new HL7ParsedSlice <TSchema>(Schema, settings, result)); }
public override ParseResult <TSchema> Parse(ParseText text, TextSpan span) { if (span.Length == 0) { throw new MacheteParserException("The body was empty"); } int i = span.Start; for (; i < span.End; i++) { if (!char.IsWhiteSpace(text[i])) { break; } } if (i + 106 > span.End) { throw new MacheteParserException("The ISA segment must contain at least 106 characters"); } if (i + 127 > span.End) { throw new MacheteParserException("The GS segment could not be present due to length"); } if (text[i] != 'I' || text[i + 1] != 'S' || text[i + 2] != 'A') { throw new MacheteParserException("The body must start with an ISA segment"); } var settings = GetX12Settings(text, TextSpan.FromBounds(i, span.End)); var streamText = new StreamText(text, null); var textCursor = new StreamTextCursor(streamText, TextSpan.FromBounds(i, span.End), TextSpan.FromBounds(span.End, span.End), _messageParser); return(new X12ParseResult <TSchema>(Schema, this, settings, textCursor)); }
public override ParseResult <TSchema> Parse(ParseText text, TextSpan span) { var result = _messageParser.Parse(text, span); if (!result.HasResult) { return(new EmptyParseResult <TSchema>(Schema, this, text, result.Next)); } if (span.Length == 0) { return(new EmptyParseResult <TSchema>(Schema, this, text, span)); } var settings = ParseSettings(text, result.Result); var streamText = new StreamText(text, null); var textCursor = new StreamTextCursor(streamText, result.Result, result.Next, _messageParser); return(new HL7ParseResult <TSchema>(Schema, this, settings, textCursor)); }
static bool NeedsMoreInput(StreamText text, TextSpan span, Result <TextSpan, TextSpan> result) { return(!result.HasResult || result.Next.Length == 0 && span.End == text.Length && text.HasNext); }
public EmptyTextCursor(StreamText text, TextSpan span) { _sourceText = text; _remainingSpan = span; }
public abstract Task <ParseResult <TSchema> > ParseAsync(StreamText text, TextSpan span);
public EmptyTextCursor(StreamText text, TextSpan span) { InputText = text; NextSpan = span; }