From 54914782c7632e041919746e80d3f802f6601a63 Mon Sep 17 00:00:00 2001 From: Vika Date: Wed, 23 Mar 2022 05:01:14 +0300 Subject: Make the settings in the database a strong type --- src/database/file/mod.rs | 10 +++++++--- src/database/memory.rs | 6 +++--- src/database/mod.rs | 22 ++++++++++++++++++---- 3 files changed, 28 insertions(+), 10 deletions(-) (limited to 'src/database') diff --git a/src/database/file/mod.rs b/src/database/file/mod.rs index af07c0c..b3856a6 100644 --- a/src/database/file/mod.rs +++ b/src/database/file/mod.rs @@ -1,5 +1,5 @@ //#![warn(clippy::unwrap_used)] -use crate::database::{filter_post, ErrorKind, Result, Storage, StorageError}; +use crate::database::{filter_post, ErrorKind, Result, Storage, StorageError, Settings}; use std::fs::{File, OpenOptions}; use std::io::{ErrorKind as IOErrorKind, Seek, SeekFrom, Read, Write}; use std::time::Duration; @@ -387,6 +387,10 @@ impl Storage for FileStorage { { symlink_result = std::os::windows::fs::symlink_file(relative, link); } + #[cfg(all(not(unix), not(windows)))] + { + compile_error!("Don't know how to create symlinks on non-unix non-windows platform"); + } if let Err(e) = symlink_result { Err(e.into()) } else { @@ -596,7 +600,7 @@ impl Storage for FileStorage { } } - async fn get_setting(&self, setting: &'_ str, user: &'_ str) -> Result { + async fn get_setting(&self, setting: Settings, user: &'_ str) -> Result { log::debug!("User for getting settings: {}", user); let url = warp::http::Uri::try_from(user).expect("Couldn't parse a URL"); let mut path = relative_path::RelativePathBuf::new(); @@ -626,7 +630,7 @@ impl Storage for FileStorage { )).await?.unwrap() } - async fn set_setting(&self, setting: &'_ str, user: &'_ str, value: &'_ str) -> Result<()> { + async fn set_setting(&self, setting: Settings, user: &'_ str, value: &'_ str) -> Result<()> { let url = warp::http::Uri::try_from(user).expect("Couldn't parse a URL"); let mut path = relative_path::RelativePathBuf::new(); path.push(url.authority().unwrap().to_string()); diff --git a/src/database/memory.rs b/src/database/memory.rs index df142d3..5e2ad52 100644 --- a/src/database/memory.rs +++ b/src/database/memory.rs @@ -6,7 +6,7 @@ use tokio::sync::RwLock; use futures_util::FutureExt; use serde_json::json; -use crate::database::{Storage, Result, StorageError, ErrorKind, MicropubChannel}; +use crate::database::{Storage, Result, StorageError, ErrorKind, MicropubChannel, Settings}; #[derive(Clone, Debug)] pub struct MemoryStorage { @@ -177,12 +177,12 @@ impl Storage for MemoryStorage { } #[allow(unused_variables)] - async fn get_setting(&self, setting: &'_ str, user: &'_ str) -> Result { + async fn get_setting(&self, setting: Settings, user: &'_ str) -> Result { todo!() } #[allow(unused_variables)] - async fn set_setting(&self, setting: &'_ str, user: &'_ str, value: &'_ str) -> Result<()> { + async fn set_setting(&self, setting: Settings, user: &'_ str, value: &'_ str) -> Result<()> { todo!() } } diff --git a/src/database/mod.rs b/src/database/mod.rs index e7baaa8..57223f8 100644 --- a/src/database/mod.rs +++ b/src/database/mod.rs @@ -39,6 +39,20 @@ pub enum ErrorKind { Other, } +/// Enum representing settings that might be stored in the site's database. +#[derive(Serialize, Debug, Clone, Copy)] +#[serde(rename_all = "snake_case")] +pub enum Settings { + /// The name of the website -- displayed in the header and the browser titlebar. + SiteName, +} + +impl std::string::ToString for Settings { + fn to_string(&self) -> String { + serde_variant::to_variant_name(self).unwrap().to_string() + } +} + /// Error signalled from the database. #[derive(Debug)] pub struct StorageError { @@ -239,10 +253,10 @@ pub trait Storage: std::fmt::Debug + Clone + Send + Sync { async fn delete_post(&self, url: &'_ str) -> Result<()>; /// Gets a setting from the setting store and passes the result. - async fn get_setting(&self, setting: &'_ str, user: &'_ str) -> Result; + async fn get_setting(&self, setting: Settings, user: &'_ str) -> Result; /// Commits a setting to the setting store. - async fn set_setting(&self, setting: &'_ str, user: &'_ str, value: &'_ str) -> Result<()>; + async fn set_setting(&self, setting: Settings, user: &'_ str, value: &'_ str) -> Result<()>; } #[cfg(test)] @@ -399,12 +413,12 @@ mod tests { async fn test_backend_settings(backend: Backend) { backend - .set_setting("site_name", "https://fireburn.ru/", "Vika's Hideout") + .set_setting(crate::database::Settings::SiteName, "https://fireburn.ru/", "Vika's Hideout") .await .unwrap(); assert_eq!( backend - .get_setting("site_name", "https://fireburn.ru/") + .get_setting(crate::database::Settings::SiteName, "https://fireburn.ru/") .await .unwrap(), "Vika's Hideout" -- cgit 1.4.1