Skip to content

Latest commit

 

History

History
287 lines (204 loc) · 7.85 KB

File metadata and controls

287 lines (204 loc) · 7.85 KB

🔍 Audit Complet des Dépendances - nonogram-solver v0.6.0

Date: 23 novembre 2025
Objectif: Identifier et éliminer les dépendances non-Rust


📊 Analyse des dépendances actuelles

Dépendances directes (Cargo.toml)

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 ⚠️ ANALYSER
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) ⚠️ OPTIONNEL

Dépendances natives (non-Rust)

tesseract (feature ocr uniquement)

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)

libc v0.2.177

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)


🔎 Analyse détaillée de l'utilisation

1. imageproc

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:

  1. Détection de contours Canny (grid_detector.rs)
  2. Dessin de cercles remplis (image_generator.rs)
  3. 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: ⚠️ REMPLACER par implémentation manuelle

2. tesseract (feature ocr)

Utilisation actuelle:

// src/ocr/mod.rs et src/ocr/advanced_extractor.rs
use tesseract::Tesseract;  // Extraction OCR

Alternatives 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)

3. Autres dépendances

Toutes les autres dépendances sont 100% Rust:

  • image: Encodage/décodage d'images en pur Rust
  • clap: Parser CLI en pur Rust
  • anyhow: Gestion d'erreurs en pur Rust
  • serde/serde_json: Sérialisation en pur Rust
  • rayon: Parallélisation en pur Rust
  • regex: Expressions régulières en pur Rust

🎯 Plan d'action

Phase 1: Éliminer imageproc ✅ RECOMMANDÉ

Objectif: Remplacer imageproc par des implémentations manuelles

Actions:

  1. ✅ Implémenter la détection de contours Canny manuellement
  2. ✅ Implémenter le dessin de cercles remplis manuellement
  3. ✅ Implémenter le dessin de croix manuellement
  4. ✅ Supprimer la dépendance imageproc de 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)

Phase 2: Garder tesseract comme feature optionnelle ✅ DÉJÀ FAIT

Objectif: Maintenir l'OCR comme feature optionnelle

Status actuel:

  • ✅ Déjà implémenté avec [features] ocr = ["tesseract"]
  • ✅ Mode --auto fonctionne sans OCR
  • ✅ Compilation par défaut sans dépendances C

Recommandation: ✅ GARDER tel quel


📈 Résultats attendus

Avant (v0.6.0 actuelle)

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)

Après (v0.7.0 proposée)

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

🔧 Implémentation proposée

1. Détection de contours Canny

Algorithme (5 étapes):

  1. Flou gaussien (réduction du bruit)
  2. Calcul du gradient (Sobel)
  3. Suppression des non-maxima
  4. Seuillage par hystérésis
  5. Suivi de contours

Code estimé: ~150 lignes

Bibliothèques utilisées: image uniquement

2. Dessin de cercles remplis

Algorithme: Algorithme de Bresenham pour cercles

Code estimé: ~50 lignes

Bibliothèques utilisées: image uniquement

3. Dessin de croix

Algorithme: Dessin de lignes (algorithme de Bresenham)

Code estimé: ~30 lignes

Bibliothèques utilisées: image uniquement


📊 Comparaison

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

✅ Recommandations finales

Priorité 1: Supprimer imageproc ⭐⭐⭐

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

Priorité 2: Garder tesseract comme feature optionnelle ⭐⭐⭐

Raison:

  • ✅ Aucune alternative Rust mature pour OCR
  • ✅ Déjà optionnel (feature ocr)
  • ✅ Mode --auto fonctionne sans OCR
  • ✅ L'utilisateur choisit

Action: Aucune modification nécessaire

Priorité 3: Documenter les dépendances ⭐⭐

Raison:

  • ✅ Transparence pour les utilisateurs
  • ✅ Facilite les contributions
  • ✅ Justifie les choix techniques

Action: Ajouter une section "Dépendances" dans le README


🎯 Conclusion

État actuel (v0.6.0):

  • 100% Rust sans feature ocr (sauf libc standard)
  • ⚠️ 1 dépendance à supprimer: imageproc
  • ✅ Feature ocr optionnelle (dépendance C++ acceptable)

État proposé (v0.7.0):

  • 100% Rust pur sans feature ocr
  • ✅ Aucune dépendance à supprimer
  • ✅ Feature ocr optionnelle (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