1
0
Fork 0
mirror of https://github.com/betagouv/mon-entreprise synced 2025-02-09 02:55:01 +00:00
mon-entreprise/source/engine/index.js
Johan Girod 00b122fa97 ⚙️ ajoute la conversion d'unité
Gros changements en perspective :
- Supprime la notion de période, au bénéfice de celle d'unité
  (`période : mensuelle` devient `unité: €/mois`)
- Améliore les rapports d'erreur avec des messages plus clair
- Ajoute un avertissement lorsque des types ne sont pas compatible
- Ajoute la conversion automatique d'unité dans le moteur
- Ajoute une notion d'unité par défaut de la simulation,
  c'est l'unité vers laquelle les règles qui ne spécifient pas
  d'unité seront converties
- Ajoute une notion d'unité par défaut des règles, qui spécifie
  l'unité de la règle qui prévaut lorsque qu'il n'y a pas
  d'unité par défaut de la simulation (utile pour les question ou
  pour s'assurer du bon type d'une règle)
2019-12-16 11:34:04 +01:00

65 lines
1.7 KiB
JavaScript

// This file exports the functions of the public computing library
import { safeLoad } from 'js-yaml'
import { collectDefaults, enrichRule, rulesFr } from './rules'
import { analyseMany, parseAll } from './traverse'
// The public evaluation function takes a nested object of input values
let inputToStateSelector = rules => input => dottedName =>
({
...collectDefaults(rules),
...input
}[dottedName])
let enrichRules = input => {
const rules = typeof input === 'string' ? safeLoad(input) : input
const rulesList = Array.isArray(rules)
? rules
: Object.entries(rules).map(([dottedName, rule]) => ({
dottedName,
...rule
}))
return rulesList.map(enrichRule)
}
class Engine {
situation = {}
parsedRules
constructor(rules = rulesFr) {
this.parsedRules = parseAll(rules)
this.defaultValues = collectDefaults(rules)
}
evaluate(targets, { defaultUnits, situation }) {
this.evaluation = analyseMany(
this.parsedRules,
targets,
defaultUnits
)(dottedName => situation[dottedName] || this.defaultValues[dottedName])
return this.evaluation.targets.map(({ nodeValue }) => nodeValue)
}
getLastEvaluationExplanations() {
return this.evaluation
}
}
export default {
evaluate: (targetInput, input, config, defaultUnits = []) => {
let rules = config
? [
...(config.base ? enrichRules(config.base) : rulesFr),
...(config.extra ? enrichRules(config.extra) : [])
]
: rulesFr
let evaluation = analyseMany(
parseAll(rules),
Array.isArray(targetInput) ? targetInput : [targetInput],
defaultUnits
)(inputToStateSelector(rules)(input))
if (config?.debug) return evaluation
let values = evaluation.targets.map(t => t.nodeValue)
return Array.isArray(targetInput) ? values : values[0]
},
Engine
}