Une facture qui demande avant de déclarer
Tout autre document ici atteint une norme en la déclarant : le fichier dit qu’il est Factur-X, et il est écrit en Factur-X. Déclarer est facile ; avoir raison ne l’est pas. Un document peut nommer une facture qu’il n’a jamais jointe, déclarer un niveau de détail que le XML à l’intérieur ne suit pas, et tenir dans un contenant que la norme n’autorise pas — et sortir en disant les trois, pour revenir refusé par le service comptable auquel il a été envoyé.
Celui-ci demande donc d’abord. La bibliothèque lit le document tel qu’il est, n’écrit rien, ne change rien, et signale tout ce qui, à sa connaissance, sépare ce document de la norme nommée — tout d’un coup, chaque constat citant la clause dont il vient et le fichier dont il parle. Pas la première faute puis un arrêt : la liste, pour qu’un seul tour de travail règle l’affaire.
La facture est composée ici comme quelqu’un l’écrit d’abord, et ce qui revient est imprimé. Deux choses font obstacle : elle ne déclare aucune norme d’archivage, et elle nomme factur-x.xml sans contenir aucun fichier sous ce nom. Corrigez ces deux-là et il en reste une — elle déclare le niveau de détail EN 16931 là où le XML suit Basic — car un fichier qui n’est pas là est un fichier que rien ne peut lire. Corrigez celle-là et plus rien ne fait obstacle, et le PDF est écrit. Rien n’est écrit tant qu’un obstacle demeure.
Un rapport vide n’est pas un certificat. Il dit que rien de ce que cette bibliothèque sait chercher ne fait obstacle, ce qui n’est pas la même chose qu’être conforme : c’est veraPDF, un programme gratuit qui n’a pris aucune part à l’écriture du fichier, qui le dit. Ce que le rapport règle, c’est le document qui se contredit lui-même, la seule faute que personne, plus loin, ne peut réparer. Les trois mêmes tours s’exécutent depuis Rust et depuis Python.
Ce que montre cet exemple
- Tous les constats d’un coup, chacun nommant la clause dont il vient et le fichier dont il parle.
- Deux obstacles à la première composition, un seul une fois le fichier contenu et la norme d’archivage déclarée, aucun une fois que le niveau de détail déclaré est celui que le XML suit.
- Le document mesuré avant qu’un seul octet n’en sorte, et refusé plutôt qu’écrit tant que quelque chose fait obstacle.
Le code source complet
Rien n’est omis et rien n’est simplifié : c’est le programme exactement tel qu’il tourne, pour le développeur qui utilise cette bibliothèque.
La troisième est la description elle-même : une simple liste de ce que la page doit dire, et c’est elle qu’on envoie au service.
Voir le code Rust
Voir le code Python
Voir le code JSON
Le document lui-même
Ouvrir le document en anglais
Ouvrir le document en français
Ouvrir le document en allemand
Ouvrir le document en espagnol
Ouvrir le document en italien
Ouvrir le document en portugais