blob: 801ee4fdb48b1505779fbed0db6cd2fc0c154195 [file] [log] [blame] [edit]
#![allow(deprecated)]
use config::{Config, File};
use notify::{DebouncedEvent, RecommendedWatcher, RecursiveMode, Watcher};
use std::collections::HashMap;
use std::sync::mpsc::channel;
use std::sync::RwLock;
use std::time::Duration;
lazy_static::lazy_static! {
static ref SETTINGS: RwLock<Config> = RwLock::new({
let mut settings = Config::default();
settings.merge(File::with_name("examples/watch/Settings.toml")).unwrap();
settings
});
}
fn show() {
println!(
" * Settings :: \n\x1b[31m{:?}\x1b[0m",
SETTINGS
.read()
.unwrap()
.clone()
.try_deserialize::<HashMap<String, String>>()
.unwrap()
);
}
fn watch() {
// Create a channel to receive the events.
let (tx, rx) = channel();
// Automatically select the best implementation for your platform.
// You can also access each implementation directly e.g. INotifyWatcher.
let mut watcher: RecommendedWatcher = Watcher::new(tx, Duration::from_secs(2)).unwrap();
// Add a path to be watched. All files and directories at that path and
// below will be monitored for changes.
watcher
.watch("examples/watch/Settings.toml", RecursiveMode::NonRecursive)
.unwrap();
// This is a simple loop, but you may want to use more complex logic here,
// for example to handle I/O.
loop {
match rx.recv() {
Ok(DebouncedEvent::Write(_)) => {
println!(" * Settings.toml written; refreshing configuration ...");
SETTINGS.write().unwrap().refresh().unwrap();
show();
}
Err(e) => println!("watch error: {:?}", e),
_ => {
// Ignore event
}
}
}
}
fn main() {
// This is just an example of what could be done, today
// We do want this to be built-in to config-rs at some point
// Feel free to take a crack at a PR
show();
watch();
}