Crates.io | setting_tracker |
lib.rs | setting_tracker |
version | 0.1.3 |
source | src |
created_at | 2024-01-21 00:21:46.333523 |
updated_at | 2024-03-10 15:33:55.552904 |
description | Utility type for tracking setting changes |
homepage | |
repository | https://gitlab.com/osteri/setting_tracker |
max_upload_size | |
id | 1107015 |
size | 13,342 |
Setting tracker is a utility type for tracking changes in your settings struct. Other parts of the program are usually only interested when a specific value changes inside settings. This library tries to help achieving that by providing utility type Setting<T>
.
You can wrap any type inside Setting<T>
where T
implements Clone
and Default
traits (Debug
is highly recommended but not enforced).
As a made up example, first define our Settings
struct (which is not part of this library):
use setting_tracker::Setting;
#[derive(Default, Debug)]
struct Settings {
port: Setting<u16>,
domain: Setting<String>,
}
User can now register callbacks when a specific setting changes:
let mut settings = Settings::default(); // equivalent of `Settings { port: 0, domain: "".to_string() }`
settings.port.cb(|old, new| println!("port: {:?} -> {:?}", old, new));
Setting can now be changed through the set
member function:
settings.port.set(1);
settings.port.set(10);
Get the value by cloning:
let _ = settings.domain.get();
Get the value as reference, when cloning is considered too expensive:
let _ = settings.domain.as_ref();
Outputs:
port: 0 -> 1
port: 1 -> 10
Run the README.md example and see it yourself:
cargo run --example readme
This is useful pattern when individual setting change needs to be tracked. The simple example above just prints setting changes, but more useful pattern would be to use pub/sub signaling for example to other threads that a setting has been changed.
See more complex examples in example directory.