mirror of
https://github.com/betagouv/mon-entreprise
synced 2025-02-09 04:05:01 +00:00
* Définition à partir du nom complet en notation pointée (plutôt que comme deux attributs indépendants "name" et "espace") * Structure de données de premier niveau "dictionnaire" plutôt que liste, s'aligne mieux avec notre contrainte d'unicité des noms * Possibilité de définir les règles à partir d'une liste dans les tests, dans ce cas il ne faut plus utiliser l'attribut "espace" mais renseigner directement la notation pointée dans le "nom".
43 lines
1.2 KiB
JavaScript
43 lines
1.2 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.js'
|
|
|
|
// 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)
|
|
}
|
|
|
|
export default {
|
|
evaluate: (targetInput, input, config) => {
|
|
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]
|
|
)(inputToStateSelector(rules)(input))
|
|
if (config?.debug) return evaluation
|
|
|
|
let values = evaluation.targets.map(t => t.nodeValue)
|
|
|
|
return Array.isArray(targetInput) ? values : values[0]
|
|
}
|
|
}
|