Beispiel #1
0
        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));
        }
Beispiel #2
0
        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"));
            }
        }
Beispiel #3
0
 public StreamTextCursor(StreamText text, TextSpan valueSpan, TextSpan nextSpan, TextParser parser)
 {
     _text      = text;
     _valueSpan = valueSpan;
     _nextSpan  = nextSpan;
     _parser    = parser;
 }
Beispiel #4
0
        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));
        }
Beispiel #5
0
 public EmptyParseResult(ISchema <TSchema> schema, IEntityParser <TSchema> parser, StreamText text, TextSpan remainingSpan)
 {
     Schema        = schema;
     Parser        = parser;
     RemainingText = text;
     RemainingSpan = remainingSpan;
 }
Beispiel #6
0
        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;
        }
Beispiel #7
0
        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));
        }
Beispiel #8
0
        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));
        }
Beispiel #9
0
        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));
        }
Beispiel #10
0
        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));
        }
Beispiel #11
0
 static bool NeedsMoreInput(StreamText text, TextSpan span, Result <TextSpan, TextSpan> result)
 {
     return(!result.HasResult || result.Next.Length == 0 && span.End == text.Length && text.HasNext);
 }
Beispiel #12
0
 public EmptyTextCursor(StreamText text, TextSpan span)
 {
     _sourceText    = text;
     _remainingSpan = span;
 }
Beispiel #13
0
 public abstract Task <ParseResult <TSchema> > ParseAsync(StreamText text, TextSpan span);
Beispiel #14
0
 public EmptyTextCursor(StreamText text, TextSpan span)
 {
     InputText = text;
     NextSpan  = span;
 }