Crates.io | drying_paint |
lib.rs | drying_paint |
version | 0.5.5 |
source | src |
created_at | 2019-11-30 22:54:48.649158 |
updated_at | 2024-01-21 03:32:26.142834 |
description | Implementation of observer pattern for Rust |
homepage | https://crates.io/crates/drying_paint |
repository | https://github.com/geeklint/drying_paint |
max_upload_size | |
id | 185616 |
size | 99,613 |
The name 'drying_paint' comes from the expression "watching paint dry". This module provides a system to "watch" some values for changes and run code whenever they change.
The typical usage is as follows: you first define a structure to hold data, including some "watched" data.
struct HelloData {
name: Watched<String>,
greeting: String,
}
Implementing the trait WatcherInit for that structure gives you an place to set-up the code that should run when a watched value changes.
impl WatcherInit for HelloData {
fn init(watcher: &mut WatcherMeta<Self>) {
watcher.watch(|root| {
root.greeting = format!("Hello, {}!", root.name);
});
}
}
Normally you need to wrap the data struct in a Watcher, so it's common to alias the watcher type to cleanup the syntax a bit:
type Hello = Watcher<HelloData>;
Creating watchers and setting watched data needs to happen within a WatchContext. WatchContext::update_current() will cause all the pending watcher code to run.
fn main() {
let mut ctx = WatchContext::new();
ctx.with(|| {
let mut obj = Hello::new();
*obj.data_mut().name = "Rust".to_string();
WatchContext::update_current();
assert_eq!(obj.data().greeting, "Hello, Rust!");
});
}