1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
|
#![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::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,
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();
}
|