2020-12-15 10:14:35 +00:00
# API
2020-05-10 11:16:13 +00:00
2021-02-18 11:46:40 +00:00
> **IMPORTANT** : publicodes est encore en version beta, et l'API peut-être sujette à des changements cassants lors de prochaines versions. Pour plus d'informations, se référer à la [feuille de route v1.0](https://github.com/betagouv/mon-entreprise/issues/1293)
2020-05-10 11:16:13 +00:00
2020-12-15 11:36:58 +00:00
## _new_ `Engine(rules)`
2020-05-18 17:00:14 +00:00
Crée un moteur d'évaluation avec les règles publicodes données en argument.
**Arguments**
2021-02-18 11:46:40 +00:00
- `rules` : les règles publicodes utilisées. Ces dernières peuvent être sous la
forme d'une chaîne de caractère `yaml` publicodes (ou d'un objet javascript
correspondant). Elle peuvent aussi être sous la forme de règles publicodes déjà parsées.
2020-05-18 17:00:14 +00:00
**Retourne**
Un moteur d'évaluation qui expose les fonctions suivantes :
2021-02-18 11:46:40 +00:00
- `setSituation`
- `evaluate`
- `getRule`
2020-05-18 17:00:14 +00:00
2020-12-15 10:14:35 +00:00
### _method_ `engine.setSituation(situation)`
2020-05-18 17:00:14 +00:00
Permet de spécifier une situation en entrée. Toutes les prochaines évaluations
seront effectuées en se basant sur ces valeurs plutôt que les valeurs présentes
2021-02-18 11:46:40 +00:00
dans la base de règles.
2020-05-18 17:00:14 +00:00
C'est le point d'entrée principal pour adapter les calculs de règles générales à
une situation particulière. La situation est gardée en mémoire, et chaque appel
à `setSituation` remplace la situation précédente. Le moteur
2021-02-18 11:46:40 +00:00
contient donc un _état interne_ . Cela permet d'obtenir de meilleures performances,
2020-11-17 10:43:38 +00:00
avec une gestion plus fine du cache de calcul. En revanche, il faut prêter une
grande attention à la bonne gestion de cet état interne.
2020-05-18 17:00:14 +00:00
**Arguments**
2020-12-15 10:14:35 +00:00
- `situation` : un objet javascript qui associe le nom complet d'une règle à sa
2021-02-18 11:46:40 +00:00
valeur. Cette valeur peut être n'importe quelle expression publicodes bien formée.
Elle sera évaluée par le moteur. Cela permet de spécifier des nombres avec unité,
des expressions, des références vers d'autres règles ou même d'utiliser des mécanismes.
2020-05-18 17:00:14 +00:00
**Retourne**
L'objet engine (`this`) sur lequel la fonction a été appelée, afin de pouvoir
2020-11-17 10:43:38 +00:00
utiliser une écriture chaînée (`engine.setSituation(situation).evaluate()`).
2020-05-18 17:00:14 +00:00
2020-12-15 10:14:35 +00:00
### _method_ `engine.evaluate(expression)`
2020-05-18 17:00:14 +00:00
Évalue l'expression dans le contexte du moteur (règle et situation).
Pour des raisons de performance, les résultats intermédiaires sont enregistrés
2020-11-17 10:43:38 +00:00
dans un cache. Par conséquent, les appels suivants seront plus rapides.
2020-05-18 17:00:14 +00:00
**Arguments**
2021-02-18 11:46:40 +00:00
- `expression` : la valeur à évaluer. Cela peut-être n'importe quelle expression publicodes
bien formée (expression arithmétique, mécanisme, réference vers une règle).
2020-05-18 17:00:14 +00:00
**Retourne**
2021-02-18 11:46:40 +00:00
2020-05-18 17:00:14 +00:00
Un objet javascript de type `EvaluatedNode` contenant la valeur calculée.
> **Attention !** Il est déconseillé d'utiliser directement les valeurs présentes
> dans l'objet retourné, étant donné que leur forme va très probablement changer
> au cours des prochaines versions du moteur.
> Utilisez la fonction `formatNode(evaluationResult)` autant que possible pour
> afficher la valeur retournée.
2020-12-15 10:14:35 +00:00
- `missingVariables` : contient les règles dont la valeur est manquante dans la situation
- `nodeValue` : la valeur calculée (type `string` , `number` , `boolean` , ou `null` )
- `unit` : si `nodeValue` est un nombre, contient l'unité associée
2020-05-18 17:00:14 +00:00
2020-12-15 10:14:35 +00:00
## _function_ `formatValue(evaluatedNode, \[options\])`
2020-05-18 17:00:14 +00:00
Formate la valeur evaluée.
**Arguments**
2020-12-15 10:14:35 +00:00
- `evaluatedNode` : l'objet retourné lors de l'appel à la fonction
d'évaluation du moteur `evaluate(expression)`
- `options` : configuration pour le formatage
- `language` : le langage utilisé pour le formatage (par défaut `fr` )
- `precision` : le nombre de chiffre après la virgule pour le formatage des
nombres (par défaut `2` )
- `displayedUnit` : l'unité à afficher pour le formatage des nombres.
Outrepasse l'unité définie dans le calcul (on peut donc forcer l'unité
affichée à une autre que celle retournée par le calcul, même si elle ne sont
pas compatibles)
2020-05-18 17:00:14 +00:00
**Retourne**
La chaîne de caractère correspondant à la valeur bien formatée.
2020-05-27 08:34:36 +00:00
2021-02-18 11:46:40 +00:00
# Composants React
2020-05-27 08:34:36 +00:00
2021-02-18 11:46:40 +00:00
Publicodes exporte des composants React permettant d'afficher une documentation
2020-05-27 08:34:36 +00:00
explorable des calculs. Cette documentation est auto-générée en s'appuyant sur
les données descriptives contenues dans les règles publicodes (description,
références, titre, note, etc.) et en affichant pour chaque règle les étapes
intermédiaires qui permettent d'aboutir au résultat affiché.
[Voir un exemple sur mon-entreprise.fr ](https://mon-entreprise.fr/documentation/imp%C3%B4t/foyer-fiscal/imp%C3%B4t-sur-le-revenu/imp%C3%B4t-brut-par-part )
2021-11-04 13:07:37 +00:00
## `<RulePage />`
2020-05-27 08:34:36 +00:00
2021-11-04 13:07:37 +00:00
Composant React permettant d'afficher la page de documentation d’ une règle
donnée.
2020-05-27 08:34:36 +00:00
Voir le [bac à sable ](https://publi.codes/studio ) pour voir le composant en
action (il est affiché sur l'écran de droite).
**Props**
2020-12-15 10:14:35 +00:00
- `engine` : l'objet moteur dont on veut afficher les calculs.
- `documentationPath` : (`string`) le chemin de base sur lequel la documentation sera
montée. Par exemple, si c'est `/documentation` l'url de la règle `rémunération . primes` sera `/documentation/rémunération/primes`
2021-11-04 13:07:37 +00:00
- `rulePath` : (`string`) le chemin de la règle à afficher
2020-12-15 10:14:35 +00:00
- `language` : le language dans lequel afficher la documentation (pour l'instant,
seuls `fr` et `en` sont supportés).
2021-11-04 13:07:37 +00:00
- `renderers` : `{ Head?: React.Component, Link: React.Component }` :
les composants React qui seront utilisés dans la page de documentation.
- `Link` : pour afficher les liens. Le composant prend un argument `to`
- `Head` : pour afficher les en-têtes de la page, balises `<meta>` , `<title>` , etc.
- `References` : pour personnaliser l'affichage des références en pied de page. Le composant reçoit l'objet `références` brut définit dans le Yaml.
En général, on voudra afficher la documentation pour l'ensemble des pages et non
pour une page en particulier. Il faut donc associer le composant `<RulePage />`
avec le routeur utilisé.
Par exemple pour `react-router` :
```jsx
import { Route, Link } from 'react-router-dom'
import { RulePage } from 'publicodes/react-ui'
export function Documentation() {
return (
< Route
path="documentation/:name+"
render={({ match }) => (
< RulePage
documentationPath="/documentation"
rulePath={match.params.name}
language="fr"
renderers={{ Link }}
/>
)}
/>
)
}
```
Autre exemple pour intégrer la documentation dans une application Next.js :
```jsx
// pages/documentation/[...slug].jsx
import Head from 'next/head';
import Link from 'next/link'
import { useRouter } from 'next/router'
export default Documentation() {
const { slug } = useRouter().query;
return < RulePage
documentationPath="/documentation"
rulePath={slug.join('/')}
language="fr"
renderers={{
Head,
Link: ({to, children}) => < Link href = {to} > < a > {children}< / a > < / Link >
}}
/>
}
```
Vous pouvez même afficher cette documentation dans une application qui n'est pas développée en React, en “montant” React seulement pour la partie documentation. Par exemple dans une application Svelte :
```html
< script >
import { onMount } from 'svelte'
import { goto } from '$app/navigation'
import { createElement } from 'react'
import { render } from 'react-dom'
import { RulePage } from 'publicodes/react-ui'
let domElement
// A Link React component that calls SvelteKit `goto` on click
function Link({ to, children }) {
const onClick = (evt) => {
evt.preventDefault()
goto(to)
}
return createElement('a', { onClick }, children)
}
const props = {
renderers: { Link },
// other props left as an exercice to the reader
}
onMount(() => {
render(createElement(RulePage, props), domElement)
})
< / script >
< div bind:this = "{domElement}" / >
```
2020-05-27 08:34:36 +00:00
2020-12-15 10:24:31 +00:00
## `<RuleLink />`
2020-05-27 08:34:36 +00:00
2021-02-18 11:46:40 +00:00
Composant React permettant de faire un lien vers une page de la documentation.
2020-05-27 08:34:36 +00:00
Par défaut, le texte affiché est le nom de la règle.
**Props**
2020-12-15 10:14:35 +00:00
- `engine` : l'objet moteur dont on veut afficher la règle.
- `documentationPath` : (`string`) le chemin de base sur lequel la documentation est
2021-11-04 13:07:37 +00:00
montée. Doit correspondre à celui précisé pour le composant `<RulePage />`
2020-12-15 10:14:35 +00:00
- `dottedName` : le nom de la règle à afficher
2021-11-04 13:07:37 +00:00
- `linkComponent` : le composant utilisé pour afficher le lien. C'est la même
interface que pour le composant `<RulePage />` . Il prend une unique prop `to`
qui est le chemin vers la règle.
2020-12-15 10:14:35 +00:00
- `displayIcon` : affiche l'icône de la règle dans le lien (par défaut à `false` )
2021-02-18 11:46:40 +00:00
- `children` : un noeud React quelconque. Par défaut, c'est le nom de la règle
2020-12-15 10:14:35 +00:00
qui est utilisé.