#![allow(deprecated)] use config::{Config, File}; use notify::{Event, RecommendedWatcher, RecursiveMode, Watcher}; use std::collections::HashMap; use std::path::Path; use std::sync::mpsc::channel; use std::sync::OnceLock; use std::sync::RwLock; use std::time::Duration; fn settings() -> &'static RwLock { static CONFIG: OnceLock> = OnceLock::new(); CONFIG.get_or_init(|| { let mut settings = Config::default(); settings .merge(File::with_name("examples/watch/Settings.toml")) .unwrap(); RwLock::new(settings) }) } fn show() { println!( " * Settings :: \n\x1b[31m{:?}\x1b[0m", settings() .read() .unwrap() .clone() .try_deserialize::>() .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, notify::Config::default().with_poll_interval(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( Path::new("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(Ok(Event { kind: notify::event::EventKind::Modify(_), .. })) => { 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(); }