aboutsummaryrefslogtreecommitdiff
path: root/mingling/src
diff options
context:
space:
mode:
Diffstat (limited to 'mingling/src')
-rw-r--r--mingling/src/example_docs.rs108
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