summary refs log tree commit diff
path: root/src/data/config.rs
diff options
context:
space:
mode:
authorAshelyn Rose <git@ashen.earth>2025-03-26 18:52:05 -0600
committerAshelyn Rose <git@ashen.earth>2025-03-26 18:52:05 -0600
commit14ad60a6d77f40fdd0b23e60e11ace8c52449c01 (patch)
tree9f3d873b035f91fb5d643071d097d69d6fcac9b3 /src/data/config.rs
parent671d8bee2676efe1058d082290993c4bba3c8029 (diff)
rough config setup
Diffstat (limited to 'src/data/config.rs')
-rw-r--r--src/data/config.rs45
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,
+        })
+    }
+}