1
0
Fork 0
mirror of https://github.com/betagouv/mon-entreprise synced 2025-02-09 04:05:01 +00:00
mon-entreprise/source/engine/grammarFunctions.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

81 lines
1.9 KiB
JavaScript

/* Those are postprocessor functions for the Nearley grammar.ne.
The advantage of putting them here is to get prettier's JS formatting, since Nealrey doesn't support it https://github.com/kach/nearley/issues/310 */
import { parseUnit } from 'Engine/units'
export let binaryOperation = operationType => ([A, , operator, , B]) => ({
[operator]: {
operationType,
explanation: [A, B]
}
})
export let unaryOperation = operationType => ([operator, , A]) => ({
[operator]: {
operationType,
explanation: [number([{ value: '0' }]), A]
}
})
export let filteredVariable = ([{ variable }, , { value: filter }]) => ({
filter: { filter, explanation: variable }
})
export let variableWithConversion = ([{ variable }, , unit]) => ({
unitConversion: { explanation: variable, unit: parseUnit(unit.value) }
})
export let variable = ([firstFragment, nextFragment], _, reject) => {
const fragments = [firstFragment, ...nextFragment].map(({ value }) => value)
if (!nextFragment.length && ['oui', 'non'].includes(firstFragment)) {
return reject
}
return {
variable: {
fragments
}
}
}
export let number = ([{ value }]) => ({
constant: {
nodeValue: parseFloat(value)
}
})
export let numberWithUnit = ([number, , unit]) => ({
constant: {
nodeValue: parseFloat(number.value),
unit: parseUnit(unit.value)
}
})
export let date = ([{ value }]) => {
let [jour, mois, année] = value.split('/')
if (!année) {
;[jour, mois, année] = ['01', jour, mois]
}
const date = new Date(année, +mois - 1, jour)
if (!+date || date.getDate() !== +jour) {
throw new SyntaxError(`La date ${value} n'est pas valide`)
}
return {
constant: {
type: 'date',
nodeValue: `${jour}/${mois}/${année}`
}
}
}
export let boolean = nodeValue => () => ({
constant: {
type: 'boolean',
nodeValue
}
})
export let string = ([{ value }]) => ({
constant: {
type: 'string',
nodeValue: value.slice(1, -1)
}
})