diff options
author | Ashelyn Rose <git@ashen.earth> | 2025-03-26 18:52:05 -0600 |
---|---|---|
committer | Ashelyn Rose <git@ashen.earth> | 2025-03-26 18:52:05 -0600 |
commit | 14ad60a6d77f40fdd0b23e60e11ace8c52449c01 (patch) | |
tree | 9f3d873b035f91fb5d643071d097d69d6fcac9b3 /src/data/config.rs | |
parent | 671d8bee2676efe1058d082290993c4bba3c8029 (diff) |
rough config setup
Diffstat (limited to 'src/data/config.rs')
-rw-r--r-- | src/data/config.rs | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/src/data/config.rs b/src/data/config.rs new file mode 100644 index 0000000..bce5c94 --- /dev/null +++ b/src/data/config.rs @@ -0,0 +1,45 @@ +use std::fs; +use std::path::{Path, PathBuf}; + +use serde::Deserialize; + +#[derive(Deserialize)] +struct ConfigFile { + site_title: Option<String>, + data_dir: Option<PathBuf>, + external_root: Option<String>, + listen_port: Option<u16>, + footer_copyright: Option<String>, +} + +pub struct Config { + site_title: String, + data_dir: PathBuf, + external_root: String, + listen_port: u16, + footer_copyright: Option<String> +} + +impl Config { + pub fn read_from_file<P: AsRef<Path>>(path: P) -> Result<Self, String> { + let config_contents = fs::read_to_string(&path) + .map_err(|_| "Unable to open config file".to_string())?; + + let file : ConfigFile = toml::from_str(&config_contents) + .map_err(|err| err.to_string())?; + + let port = file.listen_port.unwrap_or(3000); + + Ok(Self { + site_title: file.site_title + .unwrap_or("Untitled StormScribe Site".to_string()), + data_dir: file.data_dir.unwrap_or(path.as_ref() + .canonicalize().map_err(|_| "Cannot resolve config file location".to_string())? + .parent().ok_or("Cannot resolve data dir".to_string())?.to_path_buf()), + external_root: file.external_root + .unwrap_or(format!("http://localhost:{port}/")), + listen_port: port, + footer_copyright: file.footer_copyright, + }) + } +} |