UNPKG

jspurefix

Version:
92 lines (81 loc) 2.97 kB
import { INumericKeyed } from '../collections/collection' import { ContainedField } from '../dictionary/contained' import { ContainedFieldSet } from '../dictionary/contained/contained-field-set' import { GroupFieldDefinition } from '../dictionary/definition/group-field-definition' export enum SegmentType { Component = 0, Group = 1, Msg = 2, Gap = 3, Batch = 4, Unknown = 5 } export class SegmentDescription { public index: number public endTag: number = 0 public endPosition: number = 0 public delimiterTag: number = 0 public delimiterPositions: number[] public currentField: ContainedField public containedDelimiterPositions: INumericKeyed<boolean> constructor ( public name: string, public startTag: number, public set: ContainedFieldSet, public startPosition: number, public readonly depth: number, public readonly type: SegmentType) { } public contains (segment: SegmentDescription): boolean { return segment.startPosition >= this.startPosition && segment.endPosition <= this.endPosition } public getInstance (instance: number): SegmentDescription { const delimiters: number[] = this.delimiterPositions if (!delimiters) { return null } if (instance < 0 || instance >= delimiters.length) { return null } const start: number = delimiters[instance] const end: number = instance < delimiters.length - 1 ? delimiters[instance + 1] - 1 : this.endPosition const name = this.type === SegmentType.Batch ? this.set.abbreviation : this.name const d: SegmentDescription = new SegmentDescription(name, this.startTag, this.set, start, this.depth, this.type) d.endPosition = end d.endTag = this.endTag return d } public startGroup (tag: number): void { this.delimiterTag = tag this.delimiterPositions = [] this.containedDelimiterPositions = {} } public addDelimiterPosition (position: number): boolean { if (this.containedDelimiterPositions[position]) { return false } this.delimiterPositions[this.delimiterPositions.length] = position this.containedDelimiterPositions[position] = true return true } public setCurrentField (tag: number): void { this.currentField = this.set.localTag[tag] || this.set.tagToField[tag] } public groupAddDelimiter (tag: number, position: number): boolean { let delimiter: boolean = false if (this.set instanceof GroupFieldDefinition) { if (this.delimiterTag && tag === this.delimiterTag) { delimiter = this.addDelimiterPosition(position) } } return delimiter } public end (i: number, pos: number, endTag: number): void { this.index = i this.currentField = null this.endPosition = pos this.endTag = endTag } }