Date: 23 novembre 2025
Objectif: Identifier et éliminer les dépendances non-Rust
| Dépendance | Version | Type | Utilisation | Status |
|---|---|---|---|---|
image |
0.25 | 100% Rust | Chargement/sauvegarde d'images | ✅ GARDER |
imageproc |
0.25 | 100% Rust | Détection de contours, dessin | |
clap |
4.5 | 100% Rust | Interface CLI | ✅ GARDER |
anyhow |
1.0 | 100% Rust | Gestion d'erreurs | ✅ GARDER |
serde |
1.0 | 100% Rust | Sérialisation | ✅ GARDER |
serde_json |
1.0 | 100% Rust | Parsing JSON | ✅ GARDER |
rayon |
1.10 | 100% Rust | Parallélisation | ✅ GARDER |
regex |
1.10 | 100% Rust | Expressions régulières | ✅ GARDER |
tesseract |
0.15 | ❌ FFI C | OCR (feature optionnelle) |
Chaîne de dépendances:
tesseract v0.15.2
├── tesseract-plumbing v0.11.1
│ ├── tesseract-sys v0.6.3 ❌ FFI vers libtesseract (C++)
│ └── libc v0.2.177
└── tesseract-sys v0.6.3
Dépendances système requises:
libtesseract-dev(bibliothèque C++)libleptonica-dev(bibliothèque C)- Compilateur C++ (g++/clang++)
Conclusion: ❌ Dépendance non-Rust via FFI (Foreign Function Interface)
Utilisation: Indirecte via plusieurs crates
- Utilisé par
rayon,image, et autres - Fournit les bindings vers la libc standard
- Inévitable pour les opérations système de bas niveau
Conclusion: ✅ Acceptable (standard Rust pour les opérations système)
Utilisation actuelle:
// src/image_parser/grid_detector.rs
use imageproc::edges::canny; // Détection de contours Canny
// src/image_generator/mod.rs
use imageproc::drawing::{draw_filled_circle_mut, draw_cross_mut}; // Dessin
// src/ocr/advanced_extractor.rs
use imageproc::drawing::draw_line_segment_mut; // (Non utilisé)Fonctionnalités utilisées:
- Détection de contours Canny (grid_detector.rs)
- Dessin de cercles remplis (image_generator.rs)
- Dessin de croix (image_generator.rs)
Alternatives 100% Rust:
- ✅ Détection Canny: Peut être implémentée manuellement (algorithme simple)
- ✅ Dessin de cercles/croix: Peut être implémenté manuellement avec
image
Recommandation:
Utilisation actuelle:
// src/ocr/mod.rs et src/ocr/advanced_extractor.rs
use tesseract::Tesseract; // Extraction OCRAlternatives 100% Rust:
- ❌ Aucune alternative mature pour OCR en pur Rust
- Alternatives partielles:
rusty-tesseract: Wrapper autour de tesseract (même problème)ocrs: OCR en Rust mais très limité (reconnaissance basique)- Modèles ML: Nécessitent
onnxruntime(C++)
Recommandation: ✅ GARDER comme feature optionnelle (déjà le cas)
Toutes les autres dépendances sont 100% Rust:
image: Encodage/décodage d'images en pur Rustclap: Parser CLI en pur Rustanyhow: Gestion d'erreurs en pur Rustserde/serde_json: Sérialisation en pur Rustrayon: Parallélisation en pur Rustregex: Expressions régulières en pur Rust
Objectif: Remplacer imageproc par des implémentations manuelles
Actions:
- ✅ Implémenter la détection de contours Canny manuellement
- ✅ Implémenter le dessin de cercles remplis manuellement
- ✅ Implémenter le dessin de croix manuellement
- ✅ Supprimer la dépendance
imageprocde Cargo.toml
Impact:
- ✅ 100% Rust (sans feature
ocr) - ✅ Réduction de la taille du binaire
- ✅ Meilleur contrôle sur les algorithmes
⚠️ Code supplémentaire à maintenir (~200-300 lignes)
Difficulté: 🟢 Faible (algorithmes bien documentés)
Objectif: Maintenir l'OCR comme feature optionnelle
Status actuel:
- ✅ Déjà implémenté avec
[features] ocr = ["tesseract"] - ✅ Mode
--autofonctionne sans OCR - ✅ Compilation par défaut sans dépendances C
Recommandation: ✅ GARDER tel quel
Sans feature ocr:
[dependencies]
image = "0.25"
imageproc = "0.25" ❌ À supprimer
clap = "4.5"
anyhow = "1.0"
serde = "1.0"
serde_json = "1.0"
rayon = "1.10"
regex = "1.10"Dépendances natives: ❌ Aucune (100% Rust avec libc standard)
Sans feature ocr:
[dependencies]
image = "0.25"
# imageproc supprimé ✅
clap = "4.5"
anyhow = "1.0"
serde = "1.0"
serde_json = "1.0"
rayon = "1.10"
regex = "1.10"Dépendances natives: ✅ AUCUNE (100% Rust pur)
Avec feature ocr:
- Ajoute
tesseract(dépendance C++ optionnelle) - L'utilisateur choisit s'il veut les dépendances C
Algorithme (5 étapes):
- Flou gaussien (réduction du bruit)
- Calcul du gradient (Sobel)
- Suppression des non-maxima
- Seuillage par hystérésis
- Suivi de contours
Code estimé: ~150 lignes
Bibliothèques utilisées: image uniquement
Algorithme: Algorithme de Bresenham pour cercles
Code estimé: ~50 lignes
Bibliothèques utilisées: image uniquement
Algorithme: Dessin de lignes (algorithme de Bresenham)
Code estimé: ~30 lignes
Bibliothèques utilisées: image uniquement
| Critère | Avec imageproc | Sans imageproc (proposé) |
|---|---|---|
| Dépendances natives | 0 | 0 |
| Taille du binaire | ~7 MB | ~6.5 MB (-7%) |
| Dépendances Rust | 8 | 7 (-1) |
| Lignes de code | ~3000 | ~3230 (+230) |
| Contrôle | Limité | Total |
| Performance | Optimisée | Similaire |
| Maintenance | Externe | Interne |
Raison:
- ✅ Atteindre 100% Rust pur (sans feature
ocr) - ✅ Réduire les dépendances
- ✅ Meilleur contrôle sur les algorithmes
- ✅ Faible complexité d'implémentation
Action: Implémenter les 3 algorithmes manuellement
Raison:
- ✅ Aucune alternative Rust mature pour OCR
- ✅ Déjà optionnel (feature
ocr) - ✅ Mode
--autofonctionne sans OCR - ✅ L'utilisateur choisit
Action: Aucune modification nécessaire
Raison:
- ✅ Transparence pour les utilisateurs
- ✅ Facilite les contributions
- ✅ Justifie les choix techniques
Action: Ajouter une section "Dépendances" dans le README
État actuel (v0.6.0):
- ✅ 100% Rust sans feature
ocr(sauf libc standard) ⚠️ 1 dépendance à supprimer:imageproc- ✅ Feature
ocroptionnelle (dépendance C++ acceptable)
État proposé (v0.7.0):
- ✅ 100% Rust pur sans feature
ocr - ✅ Aucune dépendance à supprimer
- ✅ Feature
ocroptionnelle (inchangée) - ✅ Meilleur contrôle sur les algorithmes
Effort estimé: 4-6 heures de développement
Bénéfices:
- ✅ 100% Rust pur (objectif atteint)
- ✅ Binaire plus léger (-7%)
- ✅ Moins de dépendances
- ✅ Meilleur contrôle
Recommandation: ⭐⭐⭐ PROCÉDER avec la suppression de imageproc