setting_tracker

Crates.iosetting_tracker
lib.rssetting_tracker
version0.1.3
sourcesrc
created_at2024-01-21 00:21:46.333523
updated_at2024-03-10 15:33:55.552904
descriptionUtility type for tracking setting changes
homepage
repositoryhttps://gitlab.com/osteri/setting_tracker
max_upload_size
id1107015
size13,342
OT (Osteri)

documentation

README

setting_tracker

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

Why?

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.

Commit count: 0

cargo fmt