export function getDmnObjectByPath()

in packages/dmn-editor/src/boxedExpressions/boxedExpressionIndex.ts [404:545]


export function getDmnObjectByPath(
  paths: ExpressionPath[],
  expressionRoot?: AllExpressionsWithoutTypes
): AllExpressionsWithoutTypes | undefined {
  if (!expressionRoot) {
    return;
  }
  return paths.reduce((expressionToEdit: AllExpressionsWithoutTypes, path) => {
    if (path.type === "conditional") {
      // root
      if (path.row === undefined) {
        return expressionToEdit as Normalized<DMN15__tConditional>;
      }
      if (path.row === "if") {
        return (expressionToEdit as Normalized<DMN15__tConditional>).if.expression;
      }
      if (path.row === "else") {
        return (expressionToEdit as Normalized<DMN15__tConditional>).else.expression;
      }
      return (expressionToEdit as Normalized<DMN15__tConditional>).then.expression;
    }
    if (path.type === "context") {
      // root
      if (path.row === undefined || path.column === undefined) {
        return expressionToEdit as Normalized<DMN15__tContext>;
      }
      if (path.column === "expression") {
        return (expressionToEdit as Normalized<DMN15__tContext>).contextEntry?.[path.row].expression;
      }
      return (expressionToEdit as Normalized<DMN15__tContext>).contextEntry?.[path.row].variable;
    }
    if (path.type === "decisionTable") {
      // root
      if (path.row === undefined || path.column === undefined) {
        return expressionToEdit as Normalized<DMN15__tDecisionTable>;
      }
      if (path.header === "input") {
        if (path.row < 0) {
          return (expressionToEdit as Normalized<DMN15__tDecisionTable>).input?.[path.column];
        }
        return (expressionToEdit as Normalized<DMN15__tDecisionTable>).rule?.[path.row].inputEntry?.[path.column];
      }
      if (path.row < 0) {
        return (expressionToEdit as Normalized<DMN15__tDecisionTable>).output?.[path.column];
      }
      return (expressionToEdit as Normalized<DMN15__tDecisionTable>).rule?.[path.row].outputEntry?.[path.column];
    }
    if (path.type === "every") {
      // root
      if (path.row === undefined) {
        return expressionToEdit as Normalized<DMN15__tQuantified>;
      }
      if (path.row === "variable") {
        return expressionToEdit as Normalized<DMN15__tQuantified>;
      }
      if (path.row === "in") {
        return (expressionToEdit as Normalized<DMN15__tQuantified>).in.expression;
      }
      return (expressionToEdit as Normalized<DMN15__tQuantified>).satisfies.expression;
    }
    if (path.type === "filter") {
      // root
      if (path.row === undefined) {
        return expressionToEdit as Normalized<DMN15__tFilter>;
      }
      if (path.row === "in") {
        return (expressionToEdit as Normalized<DMN15__tFilter>).in.expression;
      }
      return (expressionToEdit as Normalized<DMN15__tFilter>).match.expression;
    }
    if (path.type === "for") {
      // root
      if (path.row === undefined) {
        return expressionToEdit as Normalized<DMN15__tFor>;
      }
      if (path.row === "variable") {
        return expressionToEdit as Normalized<DMN15__tFor>;
      }
      if (path.row === "in") {
        return (expressionToEdit as Normalized<DMN15__tFor>).in.expression;
      }
      return (expressionToEdit as Normalized<DMN15__tFor>).return.expression;
    }
    if (path.type === "functionDefinition") {
      // root
      if (!path.parameterIndex) {
        return expressionToEdit as Normalized<DMN15__tFunctionDefinition>;
      }
      if (path.parameterIndex < 0) {
        return (expressionToEdit as Normalized<DMN15__tFunctionDefinition>).expression;
      }
      return expressionToEdit as Normalized<DMN15__tFunctionDefinition>;
    }
    if (path.type === "invocation") {
      // root
      if (path.row === undefined || path.column === undefined) {
        return expressionToEdit as Normalized<DMN15__tInvocation>;
      }
      if (path.column === "parameter") {
        return (expressionToEdit as Normalized<DMN15__tInvocation>).binding?.[path.row].parameter;
      }
      if (path.column === "expression" && path.row >= 0) {
        return (expressionToEdit as Normalized<DMN15__tInvocation>).binding?.[path.row].expression;
      }
      // function call
      return (expressionToEdit as Normalized<DMN15__tInvocation>).expression;
    }
    if (path.type === "list") {
      // root
      if (path.row === undefined) {
        return expressionToEdit as Normalized<DMN15__tList>;
      }
      return (expressionToEdit as Normalized<DMN15__tList>).expression?.[path.row];
    }
    if (path.type === "literalExpression") {
      return expressionToEdit as Normalized<DMN15__tLiteralExpression>;
    }
    if (path.type === "relation") {
      // root
      if (path.row === undefined || path.column === undefined) {
        return expressionToEdit as Normalized<DMN15__tRelation>;
      }
      if (path.row < 0) {
        return (expressionToEdit as Normalized<DMN15__tRelation>).column?.[path.column];
      }
      return (expressionToEdit as Normalized<DMN15__tRelation>).row?.[path.row].expression?.[path.column];
    }
    if (path.type === "some") {
      // root
      if (path.row === undefined) {
        return expressionToEdit as Normalized<DMN15__tQuantified>;
      }
      if (path.row === "variable") {
        return expressionToEdit as Normalized<DMN15__tQuantified>;
      }
      if (path.row === "in") {
        return (expressionToEdit as Normalized<DMN15__tQuantified>).in.expression;
      }
      return (expressionToEdit as Normalized<DMN15__tQuantified>).satisfies.expression;
    }
  }, expressionRoot);
}