All files / src/objects domain.ts

94.28% Statements 99/105
84.48% Branches 49/58
87.5% Functions 7/8
94.28% Lines 99/105

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 1051x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 173x 173x 1x 1x 7x 7x 1x 1x     1x 1x 4x 4x 4x 4x 4x 1x 1x 30x 30x 30x 30x 1x 1x 11x 4x 11x     7x 7x 11x 11x 11x 1x 1x 31x 3x 3x 28x 28x 28x 28x 31x     28x 31x 31x 31x 31x 55x 55x 55x 55x 55x 55x 55x 55x 28x 28x 31x 31x 31x 31x 31x 31x 31x 31x 31x 31x 1x 1x 26x 26x 1x 1x
import {AbstractObject} from "./_abstract_object";
import {AbstractType} from "../abap/types/basic/_abstract_type";
import * as Types from "../abap/types/basic";
import {IRegistry} from "../_iregistry";
import {DDIC} from "../ddic";
import {xmlToArray} from "../xml_utils";
 
export interface DomainValue {
  language: string,
  low: string,
  high: string,
  description: string
}
 
export class Domain extends AbstractObject {
 
  private parsedXML: {
    description?: string,
    datatype?: string,
    length?: string,
    decimals?: string,
    conversionExit?: string,
    values?: DomainValue[],
  } | undefined;
  private parsedType: AbstractType | undefined;
 
  public getType(): string {
    return "DOMA";
  }
 
  public getDescription(): string | undefined {
    return this.parsedXML?.description;
  }
 
  public getConversionExit(): string | undefined {
    return this.parsedXML?.conversionExit;
  }
 
  public getAllowedNaming() {
    return {
      maxLength: 30,
      allowNamespace: true,
    };
  }
 
  public setDirty(): void {
    this.parsedXML = undefined;
    this.parsedType = undefined;
    super.setDirty();
  }
 
  public parseType(reg: IRegistry, parent?: string): AbstractType {
    if (this.parsedType) {
      return this.parsedType;
    } else if (this.parsedXML === undefined) {
      return new Types.UnknownType("Domain " + this.getName() + " parser error", this.getName());
    }
    const ddic = new DDIC(reg);
    this.parsedType = ddic.textToType(this.parsedXML.datatype, this.parsedXML.length,
                                      this.parsedXML.decimals, parent || this.getName(), parent !== undefined);
    return this.parsedType;
  }
 
  public parse() {
    if (this.parsedXML) {
      return {updated: false, runtime: 0};
    }
 
    const start = Date.now();
    this.parsedXML = {};
    const parsed = super.parseRaw2();
    if (parsed === undefined) {
      return {updated: false, runtime: 0};
    }
 
    const dd01v = parsed.abapGit?.["asx:abap"]?.["asx:values"]?.DD01V;
    const dd07v_tab = xmlToArray(parsed.abapGit?.["asx:abap"]?.["asx:values"]?.DD07V_TAB?.DD07V);
    const values: DomainValue[] = [];
    for (const ddo7v of dd07v_tab) {
      const value: DomainValue = {
        description: ddo7v?.DDTEXT,
        low: ddo7v?.DOMVALUE_L,
        high: ddo7v?.DOMVALUE_H,
        language: ddo7v?.DDLANGUAGE,
      };
      values.push(value);
    }
 
    this.parsedXML = {
      description: dd01v?.DDTEXT,
      datatype: dd01v?.DATATYPE,
      length: dd01v?.LENG,
      conversionExit: dd01v?.CONVEXIT,
      decimals: dd01v?.DECIMALS,
      values: values,
    };
    const end = Date.now();
    return {updated: true, runtime: end - start};
  }
 
  public getFixedValues() {
    return this.parsedXML?.values ?? [];
  }
 
}