feat(config): support setting the refresh rate for hot-reloading

This commit is contained in:
Orhun Parmaksız 2022-03-12 00:02:25 +03:00
parent 0f893ba058
commit 9e5bd112e7
No known key found for this signature in database
GPG key ID: F83424824B3E4B90
5 changed files with 38 additions and 7 deletions

11
Cargo.lock generated
View file

@ -935,6 +935,16 @@ version = "2.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4"
[[package]]
name = "humantime-serde"
version = "1.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "57a3db5ea5923d99402c94e9feb261dc5ee9b4efa158b0315f788cf549cc200c"
dependencies = [
"humantime",
"serde",
]
[[package]]
name = "idna"
version = "0.2.3"
@ -1637,6 +1647,7 @@ dependencies = [
"glob",
"hotwatch",
"humantime",
"humantime-serde",
"infer",
"lazy-regex",
"log",

View file

@ -29,6 +29,7 @@ regex = "1.5.4"
serde_regex = "1.1.0"
lazy-regex = "2.2.1"
humantime = "2.1.0"
humantime-serde = "1.1.1"
glob = "0.3.0"
ring = "0.16.20"
hotwatch = "0.4.5"

View file

@ -1,3 +1,6 @@
[config]
refresh_rate="1s"
[server]
address="127.0.0.1:8000"
#workers=4

View file

@ -3,16 +3,27 @@ use crate::random::RandomURLConfig;
use byte_unit::Byte;
use config::{self, ConfigError};
use std::path::{Path, PathBuf};
use std::time::Duration;
/// Configuration values.
#[derive(Debug, Clone, Default, serde::Serialize, serde::Deserialize)]
pub struct Config {
/// Configuration settings.
pub config: Option<Settings>,
/// Server configuration.
pub server: ServerConfig,
/// Paste configuration.
pub paste: PasteConfig,
}
/// General settings for configuration.
#[derive(Debug, Clone, Default, serde::Serialize, serde::Deserialize)]
pub struct Settings {
/// Refresh rate of the configuration file.
#[serde(with = "humantime_serde")]
pub refresh_rate: Duration,
}
/// Server configuration.
#[derive(Debug, Clone, Default, serde::Serialize, serde::Deserialize)]
pub struct ServerConfig {

View file

@ -21,11 +21,8 @@ async fn main() -> IoResult<()> {
dotenv::dotenv().ok();
let config_path =
PathBuf::from(env::var("CONFIG").unwrap_or_else(|_| String::from("config.toml")));
let config = Arc::new(RwLock::new(
Config::parse(&config_path).expect("failed to parse config"),
));
let cloned_config = Arc::clone(&config);
let server_config = config.read().expect("cannot acquire config").server.clone();
let config = Config::parse(&config_path).expect("failed to parse config");
let server_config = config.server.clone();
// Create necessary directories.
fs::create_dir_all(&server_config.upload_path)?;
@ -34,10 +31,18 @@ async fn main() -> IoResult<()> {
}
// Set up a watcher for the configuration file changes.
let mut hotwatch = Hotwatch::new_with_custom_delay(Duration::from_secs(1))
.expect("failed to initialize configuration file watcher");
let mut hotwatch = Hotwatch::new_with_custom_delay(
config
.config
.as_ref()
.map(|v| v.refresh_rate)
.unwrap_or_else(|| Duration::from_secs(1)),
)
.expect("failed to initialize configuration file watcher");
// Hot-reload the configuration file.
let config = Arc::new(RwLock::new(config));
let cloned_config = Arc::clone(&config);
let config_watcher = move |event: Event| {
if let Event::Write(path) = event {
match Config::parse(&path) {