// lib.rs — Racine de la bibliothèque partagée // // Ce fichier est compilé dans les DEUX modes : // "ssr" → le serveur Axum l'utilise pour rendre du HTML // "hydrate" → trunk le compile en WebAssembly pour le navigateur // // C'est ce partage de code qui rend Leptos "full-stack" : // on écrit les composants une fois, ils s'exécutent des deux côtés. // Déclaration des sous-modules de cette bibliothèque. // `pub` les rend accessibles depuis main.rs et d'autres crates. pub mod app; // Composant racine App() et configuration du routeur pub mod client; // Pages et composants de l'interface utilisateur pub mod models; // Structs de données partagés server + client (Network, Host, Port, Application) pub mod server; // Handlers HTTP et logique métier côté serveur // Point d'entrée WebAssembly — exécuté par le navigateur au chargement du bundle .wasm // // `#[cfg(feature = "hydrate")]` : ce code n'existe que dans le bundle WASM. // `#[wasm_bindgen(start)]` : demande à wasm-bindgen d'appeler cette fonction // automatiquement sans intervention JavaScript. #[cfg(feature = "hydrate")] #[wasm_bindgen::prelude::wasm_bindgen(start)] pub fn hydrate() { use crate::app::App; // Active les messages d'erreur Rust dans la console du navigateur. // Sans ça, un panic Rust en WASM affiche juste "unreachable executed" — inutile. // `set_once()` garantit qu'on ne l'initialise pas plusieurs fois si hydrate() est appelé plusieurs fois. console_error_panic_hook::set_once(); // Monte l'application Leptos dans le de la page HTML. // // En mode "hydration" (SSR + WASM), Leptos ne recrée pas le DOM depuis zéro. // Il trouve le HTML déjà rendu par le serveur et y attache les event listeners // pour rendre l'interface interactive. C'est plus rapide qu'un SPA classique // qui construit tout le DOM côté client. // // `hydrate_body` (Leptos 0.7) = mode SSR + hydration (≠ `mount_to_body` qui repart de zéro) leptos::mount::hydrate_body(App); }