Une facture qui demande avant de revendiquer
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, revendiquer 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 rend tout ce qu'elle sait se dresser entre ce document et 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 revendique 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 revendique 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 mêmes trois 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 revendiquée, aucun une fois que le niveau de détail revendiqué 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 celui qui écrit vos logiciels.
Voir le code Rust
Voir le code Python
Le document lui-même
Ouvrir le document en anglais
Ouvrir le document en français