diff options
Diffstat (limited to 'mingling')
| -rw-r--r-- | mingling/src/example_docs.rs | 108 |
1 files changed, 108 insertions, 0 deletions
diff --git a/mingling/src/example_docs.rs b/mingling/src/example_docs.rs index 3755553..f14aa30 100644 --- a/mingling/src/example_docs.rs +++ b/mingling/src/example_docs.rs @@ -1412,6 +1412,114 @@ pub mod example_hook {} /// gen_program!(); /// ``` pub mod example_implicit_dispatcher {} +/// Example Lazy Resources +/// +/// > This example demonstrates how to use `LazyRes` for lazy resource initialization. +/// +/// Run: +/// ```bash +/// cargo run --manifest-path examples/example-lazy-resources/Cargo.toml --quiet none +/// +/// cargo run --manifest-path examples/example-lazy-resources/Cargo.toml --quiet show +/// ``` +/// +/// Output: +/// ```plaintext +/// None +/// +/// Initialized +/// foo: bar +/// rust: lang +/// baz: qux +/// hello: world +/// key: value +/// ``` +/// +/// Source code (./Cargo.toml) +/// ```toml +/// [package] +/// name = "example-lazy-resources" +/// version = "0.1.0" +/// edition = "2024" +/// +/// [dependencies.mingling] +/// path = "../../mingling" +/// features = [] +/// ``` +/// +/// Source code (./src/main.rs) +/// ```ignore +/// use std::collections::BTreeMap; +/// +/// use mingling::{LazyInit, LazyRes, prelude::*}; +/// +/// type Key = String; +/// type Value = String; +/// +/// // Define a resource that requires time-consuming initialization +/// #[derive(Default, Clone)] +/// pub struct ResLargeData { +/// pub data: BTreeMap<Key, Value>, +/// } +/// +/// fn init_res_large_data() -> ResLargeData { +/// // Perform time-consuming initialization here +/// let mut data = BTreeMap::new(); +/// data.insert("foo".to_string(), "bar".to_string()); +/// data.insert("baz".to_string(), "qux".to_string()); +/// data.insert("hello".to_string(), "world".to_string()); +/// data.insert("rust".to_string(), "lang".to_string()); +/// data.insert("key".to_string(), "value".to_string()); +/// +/// // Print to indicate initialization is complete +/// println!("Initialized"); +/// ResLargeData { data } +/// } +/// +/// dispatcher!("show", CMDShow => EntryShow); +/// dispatcher!("none", CMDNone => EntryNone); +/// +/// pack!(ResultShow = BTreeMap<Key, Value>); +/// +/// fn main() { +/// let mut program = ThisProgram::new(); +/// +/// // --------- IMPORTANT --------- +/// // _ Use lazy_init to create LazyRes<ResLargeData> +/// // / +/// // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv +/// program.with_resource(ResLargeData::lazy_init(init_res_large_data)); +/// // --------- IMPORTANT --------- +/// +/// program.with_dispatchers((CMDShow, CMDNone)); +/// program.exec_and_exit(); +/// } +/// +/// // Inject LazyRes instead of a normal resource +/// // __________________________ Must use &mut because `get_ref` and `get_mut` +/// // / both require mutable borrow +/// // | _____________________ Use LazyRes<ResLargeData> +/// // | / instead of ResLargeData +/// #[renderer] // vvvv vvvvvvvvvvvvvvvvvvvvv +/// fn render_entry_show(_args: EntryShow, res: &mut LazyRes<ResLargeData>) { +/// // _______ Initialization happens here +/// // / +/// // vvvvvvv +/// let res = res.get_ref(); +/// for (key, value) in &res.data { +/// r_println!("{}: {}", key, value); +/// } +/// } +/// +/// // When not using LazyRes<ResLargeData>, it will not be initialized +/// #[renderer] +/// fn render_entry_none(_args: EntryNone) { +/// r_println!("None"); +/// } +/// +/// gen_program!(); +/// ``` +pub mod example_lazy_resources {} /// Example Panic Unwind /// /// > This example introduces how to catch Panic in the Mingling program loop |
