aboutsummaryrefslogtreecommitdiff
path: root/examples/example-resources/src/main.rs
diff options
context:
space:
mode:
Diffstat (limited to 'examples/example-resources/src/main.rs')
-rw-r--r--examples/example-resources/src/main.rs57
1 files changed, 57 insertions, 0 deletions
diff --git a/examples/example-resources/src/main.rs b/examples/example-resources/src/main.rs
new file mode 100644
index 0000000..63ebfe6
--- /dev/null
+++ b/examples/example-resources/src/main.rs
@@ -0,0 +1,57 @@
+//! `Mingling` Example - Global Resource Injection
+//!
+//! This example demonstrates how to use global resource injection in `#[chain]` functions.
+//! You can inject both immutable (`&T`) and mutable (`&mut T`) references to global resources.
+//!
+//! # How to Run
+//! ```bash
+//! cargo run --manifest-path ./examples/example-resources/Cargo.toml -- setup
+//! ```
+
+use mingling::prelude::*;
+use std::{env::current_dir, path::PathBuf};
+
+// Define a resource for storing global state
+#[derive(Default, Clone)]
+pub struct MyResource {
+ current_dir: PathBuf,
+}
+
+fn main() {
+ let mut program = ThisProgram::new();
+
+ // Add the resource to the program
+ program.with_resource(MyResource::default());
+
+ program.with_dispatcher(SetupCommand);
+ program.exec_and_exit();
+}
+
+dispatcher!("setup", SetupCommand => SetupEntry);
+pack!(StateRead = ());
+pack!(ResultCurrentDir = PathBuf);
+
+#[chain]
+fn setup(
+ _prev: SetupEntry,
+ resource: &mut MyResource, // Import the resource into `setup`
+) -> NextProcess {
+ // Set the global resource
+ resource.current_dir = current_dir().unwrap();
+
+ StateRead::default()
+}
+
+#[chain]
+fn read(_prev: StateRead, resource: &MyResource) -> NextProcess {
+ // Read the global resource
+ let current_dir = resource.current_dir.clone();
+ ResultCurrentDir::new(current_dir).to_render()
+}
+
+#[renderer]
+fn render_current_dir(dir: ResultCurrentDir) {
+ r_println!("Current dir: {}", dir.to_string_lossy())
+}
+
+gen_program!();