1
0
Fork 0
mirror of https://github.com/betagouv/mon-entreprise synced 2025-02-09 23:55:01 +00:00
mon-entreprise/source/engine/variables.js
Mael 6154419250 Changement de programme : tentative d'implé de l'unité dans l'eval
Car quand on parse et qu'on tombe sur une variable, on ne rentre pas
dans cette variable. Elle sera traitée par la suite dans le parseAll.
Ainsi on ne peut pas connaître son unité si elle a une formule

A = B * C
B = D / E

C unité km
D unité €
E unité km

Quand on tombe sur B dans A, B n'est pas encore parsée, et donc on ne
peut pas savoir que B est en € / km.

Il faudrait parser B, ce qui serait trop couteux. On pourrait
implémenter un cache au parsing, implémenter les unités comme des fonctions, ou encore gérer les unités lors de l'éval (ce qui est bête, car on n'a pas besoin des valeurs pour inférer les unités)
2019-07-12 10:33:02 +02:00

40 lines
1.3 KiB
JavaScript

import { dropLast, isEmpty, last } from 'ramda'
import { joinName, splitName } from './rules'
let evaluateBottomUp = situationGate => startingFragments => {
let rec = (parentFragments, childFragments = []) =>
parentFragments.length == 0
? null
: do {
let query = joinName(parentFragments),
expectedResult = isEmpty(childFragments)
? 'oui'
: joinName(childFragments)
situationGate(query) == null
? rec(dropLast(1)(parentFragments), [
last(parentFragments),
...childFragments
])
: situationGate(query) == expectedResult
}
return rec(startingFragments)
}
let formatBooleanValue = { oui: true, non: false }
export let getSituationValue = (situationGate, variableName, rule) => {
// get the current situation value
// it's the user input or test input, possibly with default values
let value = situationGate(variableName)
if (rule.API) return typeof value == 'string' ? JSON.parse(value) : value
if (rule.unit != null) return value
// a leaf variable with an unit attribute is not boolean
if (formatBooleanValue[value] !== undefined) return formatBooleanValue[value]
if (rule.formule && rule.formule['une possibilité'])
return evaluateBottomUp(situationGate)(splitName(variableName))
return value
}