Vocabulaire des catalogues
Un contrat se lit nom → versions → N → revisions → R → fields. Le vocabulaire des champs est fermé, et c'est voulu : il est interprété par le moteur, jamais exécuté.
| mot | où | sens | exemple du chat |
|---|---|---|---|
type | règle de champ | Obligatoire. "string", "number" (fini), "boolean", "object", "array". | ecrit: { type: "boolean", required: true } |
required | règle de champ | Le champ doit être présent dans un payload de cette révision. Peut passer de faux à vrai d'une révision à l'autre, avec un default. | texte: { type: "string", required: true, … } |
pattern | string seulement | Expression régulière, source JavaScript. Vérifiée à la validation. | ref: { pattern: "^[0-9a-f-]{36}$" } |
enum | primitifs | Tableau non vide de valeurs admises, du type déclaré. | event: { enum: ["connected", "resumed", "disconnected", "expired"] } |
default | règle de champ | Valeur de complétion à l'upcast, jamais à la validation. Nécessaire sur un champ requis ajouté en révision > 0. Interdit sur un membre de oneOf. | (absent du chat, qui n'a que des révisions sans champ ajouté requis) ; color: { …, default: "black" } dans le tuto 5 |
fields | révision, ou champ object | Les sous-champs. Obligatoire sur tout objet : pas d'objet opaque. | accord: { type: "object", fields: { pseudo: {…} } } |
items | champ array | La règle de chaque élément. Obligatoire. | participants: { type: "array", items: { type: "object", fields: {…} } } |
oneOf | révision, ou champ object | Exactement un des champs listés est présent. Ses membres restent optionnels et sans default : l'upcast ne vérifie pas l'invariant, il ne doit pas pouvoir le casser. | oneOf: ["accord", "refus"] ; oneOf: ["message", "historique"] |
upcastFrom | version N ≥ 2 | Comment un payload N−1 devient un payload N : rename (carte ancien→nouveau chemin), defaults (chemin→valeur, posé si absent), remove (liste de chemins). Le . est le séparateur de chemin, interdit dans les noms de champ. | tuto 5 : rename: { "color": "style.color" } |
examples / counterexamples | contrat | Preuves : { version: { révision: [payload] } } et { version: { révision: [{ reason, payload }] } }. Hors du hash de contenu. | chaque contrat du chat |
Ce que le vocabulaire ne permet pas, et pourquoi
- Pas de
minLength,min,max: unpatternborne une string ; une borne numérique relève du composant. - Pas de règle conditionnelle « si X alors Y » : c'est
oneOfqui porte les formes alternatives. - Pas de type
date: string ISO contrainte parpattern, ounumber. - Pas de référence entre contrats : chaque contrat est autonome et se lit seul.