# Règles — Architecture (Pena-tauri) ## Principe L'architecture est **Clean Architecture**. Toute nouvelle fonctionnalité doit respecter ce découpage sans exception. ## Structure Rust (`src-tauri/src/`) ``` domain/ — entités et traits purs, zéro dépendance externe application/ — services métier, dépend uniquement de domain/ infrastructure/ — implémentations concrètes des traits de domain/ commands/ — points d'entrée Tauri (#[tauri::command]), orchestrent application/ ``` ## Structure JS (`src/`) ``` services/ — appels Tauri (invoke), logique de données state/ — état global de l'application ui/ — composants d'affichage, sans logique métier ``` ## Règles de dépendance | Couche | Peut dépendre de | Ne peut PAS dépendre de | |---|---|---| | `domain` | rien | `application`, `infrastructure`, `commands` | | `application` | `domain` | `infrastructure`, `commands` | | `infrastructure` | `domain` | `application`, `commands` | | `commands` | `application`, `domain` | `infrastructure` directement | | `ui/` (JS) | `services/`, `state/` | rien d'externe hors Tauri | | `services/` (JS) | invoke Tauri | `ui/` | ## Ce qui est interdit - Instancier une implémentation concrète (`ComrakRenderer`, `FileRepository`, etc.) depuis `application/` ou `commands/` — passer par injection de dépendance ou par le point d'assemblage (`lib.rs`). - Mettre de la logique métier dans `commands/` ou `ui/`. - Mettre des appels Tauri (`invoke`) dans `ui/` — les déléguer à `services/`. - Créer un module hors de ces quatre couches Rust sans justification explicite. ## Point d'assemblage `lib.rs` est le seul endroit où les implémentations concrètes sont instanciées et câblées aux services. ## Nouveau code Avant d'ajouter un fichier, se poser la question : **dans quelle couche appartient cette responsabilité ?** - Règle métier / contrat → `domain/` - Orchestration d'un cas d'usage → `application/` - Accès I/O, filesystem, bibliothèque tierce → `infrastructure/` - Commande exposée à Tauri → `commands/`