/// <summary> /// Tries to parse what had been collected before a new message starts. /// </summary> /// <param name="segmentContext">The current segment.</param> /// <param name="tag">The start new message tag.</param> /// <returns>If flushed.</returns> internal bool Flush(SegmentContext segmentContext, SegmentTags tag) { if ((segmentContext.IsControl || segmentContext.Tag == tag) && CurrentMessage.Any()) { foreach (var c in segmentContext.Value) { Buffer.Enqueue(c); } Buffer.Enqueue(Separators.Segment); try { if (CurrentGroupHeader != null) { CurrentMessage.Add(CurrentGroupHeader); } Item = CurrentMessage.Analyze(Separators, BuildContext()); } finally { CurrentMessage.Clear(); } return(true); } return(false); }
/// <summary> /// Initializes a new instance of the <see cref="SegmentContext"/> class. /// </summary> /// <param name="ediSegment">The segment line.</param> /// <param name="separators">The separators.</param> public SegmentContext(string ediSegment, Separators separators) { if (string.IsNullOrEmpty(ediSegment)) { throw new ArgumentNullException("ediSegment"); } if (separators == null) { throw new ArgumentNullException("separators"); } var dataElements = ediSegment.Split(new [] { separators.DataElement }, StringSplitOptions.None); // Support for blank/situational segments if (dataElements[0] == ediSegment) { dataElements[0] = dataElements[0].TrimEnd(separators.Segment); } Name = string.Concat(dataElements[0].Take(3)); Value = ediSegment; // UNA segments don't have values if (ediSegment.StartsWith(SegmentTags.UNA.ToString(), StringComparison.Ordinal)) { Name = SegmentTags.UNA.ToString(); } if (dataElements.Length > 1) { // Handle blank segments, e.g. BHT+' var firstComponentDataElements = dataElements[1].Split(new[] { separators.ComponentDataElement }, StringSplitOptions.None); FirstValue = firstComponentDataElements[0]; if (dataElements.Length > 2) { var secondComponentDataElements = dataElements[2].Split(new[] { separators.ComponentDataElement }, StringSplitOptions.None); SecondValue = secondComponentDataElements[0]; } if (Name == Hl && !string.IsNullOrEmpty(dataElements[2])) { ParentId = dataElements[2]; } } IsJump = Jump(); Tag = ediSegment.ToSegmentTag(separators); IsControl = Control(); LogName = ToLogName(); }
public SegmentContext(string ediSegment, Separators separators) { if (string.IsNullOrEmpty(ediSegment)) { throw new ArgumentNullException("ediSegment"); } if (separators == null) { throw new ArgumentNullException("separators"); } var dataElements = ediSegment.Split(new [] { separators.DataElement }, StringSplitOptions.None); if (dataElements.Length < 2) { throw new Exception("Segment is blank."); } Name = dataElements[0]; Value = ediSegment; // UNA segments don't have values if (ediSegment.StartsWith(SegmentTags.UNA.ToString())) { Name = SegmentTags.UNA.ToString(); } // Handle blank segments, e.g. BHT+' var firstComponentDataElements = dataElements[1].Split(new[] { separators.ComponentDataElement }, StringSplitOptions.None); FirstValue = firstComponentDataElements[0]; if (dataElements.Length > 2) { var secondComponentDataElements = dataElements[2].Split(new[] { separators.ComponentDataElement }, StringSplitOptions.None); SecondValue = secondComponentDataElements[0]; } if (Name == Hl && !string.IsNullOrEmpty(dataElements[2])) { ParentId = dataElements[2]; } IsJump = Name == Hl && FirstValue != null && FirstValue != "1" && (int.Parse(FirstValue) - int.Parse(ParentId ?? "0") > 1); Tag = ediSegment.ToSegmentTag(separators); IsHeader = Header(); LogName = ToLogName(); }