---
name: Patterns Rust observés dans TougliGui
description: Conventions de code Rust/Tauri utilisées dans le projet (state, erreurs, SQL, modules)
type: project
---

## State Tauri
`DbState(pub Mutex<Connection>)` dans `commands.rs` — une seule connexion SQLite partagée via Mutex.

## Propagation d'erreurs
Les commandes Tauri retournent `Result<T, String>` : `.map_err(|e| e.to_string())`. Pas de type d'erreur custom.

## Paramètres SQL positionnels
rusqlite utilise `?1`, `?2`... (positionnels nommés) et non `?` (positionnels ordinals). Les fonctions `get_cached_previews` et `get_cached_urls` construisent dynamiquement les placeholders avec `format!("?{}", i)` pour les `IN (...)` variadic.

## Sérialisation JSON en DB
`quest_previews.indicators_json` stocke un `Vec<CombatIndicator>` sérialisé via `serde_json`. Désérialisé au retour avec `serde_json::from_str`.

## Structure CombatIndicator (parser.rs)
```rust
pub struct CombatIndicator {
    pub combat_type: String,
    pub count: String,
    #[serde(default)] pub label: Option<String>,
    #[serde(default)] pub evitable: bool,
}
```

## Pattern tests unitaires DB
```rust
fn test_db() -> Connection {
    let conn = Connection::open_in_memory().unwrap();
    crate::db::migrate(&conn).unwrap();
    conn
}
```
Chaque test crée sa propre DB in-memory → isolation totale, pas de cleanup nécessaire.

**Why:** Conventions observées directement dans le code source.
**How to apply:** Respecter ces patterns dans tous les ajouts futurs pour maintenir la cohérence.
