Support IDE limité
Le développeur signale que l’environnement Zig ne propose que la coloration syntaxique et une autocomplétion basique, contrairement à RustRover qui offre un ensemble complet d’assistances. Cette absence d’intégration pousse à l’utilisation exclusive de la ligne de commande. Le passage à un terminal avec helix, alacritty et zellij devient alors la méthode principale pour compiler et tester le code.
Structure de fichiers à plat
En Rust, la hiérarchie typique comporte plusieurs sous‑répertoires (src/parser/, src/query/, etc.). En Zig, le projet présenté utilise uniquement cinq fichiers au niveau src/ : root.zig, parser.zig, model.zig, model_query.zig et query.zig. Cette organisation « flat » réduit les importations croisées, mais augmente la taille de chaque fichier. L’auteur note que la friction d’importation décourage la création de sous‑dossiers tant que le projet ne dépasse pas un certain seuil de complexité.
Gestion des tests via build.zig
Le système de construction Zig repose sur le fichier build.zig. Les commandes utilisées sont :
zig build test # exécute tous les tests
zig build test -Dfilter="filter match function basic" # exécute un test ciblé
zig build test -Ddebug-query=true # active le mode debug pour tous les tests
zig build compliance # lance la suite de conformité RFC 9535
zig build check # exécute les tests unitaires + conformitéContrairement à Rust, où les tests unitaires sont souvent intégrés inline et les tests d’intégration placés dans un répertoire tests/, Zig nécessite une configuration explicite dans build.zig. L’auteur décrit la verbosité supplémentaire comme un coût lié à la gestion manuelle de la mémoire, même si le cadre de test reste fonctionnel.
Paradigme fonctionnel et gestion mémoire
Rust intègre de nombreux concepts fonctionnels : itérateurs à coût nul, monades d’erreur, pattern matching et traits. Le projet JSONPath en Rust exploite ces idiomes, notamment via le type Queryable pour la composition d’erreurs. Zig, en revanche, ne propose pas de système de monades natif et requiert une gestion explicite des pointeurs et de l’allocation. Cette différence se traduit par une implémentation plus verbeuse lorsqu’il s’agit de manipuler des structures de données complexes, même si le langage reste performant au niveau bas‑niveau.