All files / libs/amalia-lang/formula/converter/shared/src/lib formulaBuilderToAmaliaFormula.ts

100% Statements 42/42
100% Branches 12/12
100% Functions 3/3
100% Lines 42/42

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 431x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 134x 134x 134x 1x 1x 133x 133x 133x 141x 141x 141x 12x 141x 68x 141x 60x 141x 1x 141x 133x 133x 133x 133x 133x 1x 1x 1x  
import {
  FormulaBuilderBlockType,
  type AmaliaFormula,
  type FormulaBuilder,
  type FormulaBuilderFormulaBlock,
  type FormulaBuilderLogicalOperatorBlock,
} from '@amalia/amalia-lang/formula/types';
 
import { formulaBuilderFunctionToAmaliaFunction } from './formulaBuilderFunctionBlockToAmaliaFormula';
 
/** Simply return the raw formula from a formula block */
const getFormulaFromFormulaBlock = (formulaBlock: FormulaBuilderFormulaBlock): AmaliaFormula => formulaBlock.formula;
 
/** Recursive function to parse and transform all nodes into pieces of AmaliaFormula */
const formulaBuilderToAmaliaFormulaRec = (block: FormulaBuilderLogicalOperatorBlock): AmaliaFormula => {
  const { logicalOperator, operands } = block;
 
  if (!operands.length) {
    throw new Error('Cannot parse empty operands');
  }
 
  return operands
    .map((operand) => {
      const { type } = operand;
      switch (type) {
        case FormulaBuilderBlockType.FORMULA:
          return getFormulaFromFormulaBlock(operand);
        case FormulaBuilderBlockType.LOGICAL_OPERATOR:
          return formulaBuilderToAmaliaFormulaRec(operand);
        case FormulaBuilderBlockType.FUNCTION:
          return formulaBuilderFunctionToAmaliaFunction(operand);
        default:
          throw new Error(`Unhandled block type: ${type}`);
      }
    })
    .filter((node) => node.length)
    .map((node) => `(${node})`)
    .join(` ${logicalOperator} `);
};
 
export const formulaBuilderToAmaliaFormula = (formulaBuilder: FormulaBuilder): AmaliaFormula =>
  formulaBuilderToAmaliaFormulaRec(formulaBuilder.root);