mirror of
https://github.com/betagouv/mon-entreprise
synced 2025-02-09 23:55:01 +00:00
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)
40 lines
1.3 KiB
JavaScript
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
|
|
}
|