diff --git a/plume-models/src/config.rs b/plume-models/src/config.rs index cb316d5b..ba705d42 100644 --- a/plume-models/src/config.rs +++ b/plume-models/src/config.rs @@ -1,4 +1,5 @@ use crate::search::TokenizerKind as SearchTokenizer; +use crate::signups::Strategy as SignupStrategy; use crate::smtp::{SMTP_PORT, SUBMISSIONS_PORT, SUBMISSION_PORT}; use rocket::config::Limits; use rocket::Config as RocketConfig; @@ -16,6 +17,7 @@ pub struct Config { pub db_name: &'static str, pub db_max_size: Option, pub db_min_idle: Option, + pub signup: SignupStrategy, pub search_index: String, pub search_tokenizers: SearchTokenizerConfig, pub rocket: Result, @@ -362,6 +364,7 @@ lazy_static! { s.parse::() .expect("Couldn't parse DB_MIN_IDLE into u32") )), + signup: var("SIGNUP").map_or(SignupStrategy::default(), |s| s.parse().unwrap()), #[cfg(feature = "postgres")] database_url: var("DATABASE_URL") .unwrap_or_else(|_| format!("postgres://plume:plume@localhost/{}", DB_NAME)), diff --git a/plume-models/src/lib.rs b/plume-models/src/lib.rs index 1115f83b..3913e63e 100644 --- a/plume-models/src/lib.rs +++ b/plume-models/src/lib.rs @@ -396,6 +396,7 @@ pub mod safe_string; #[allow(unused_imports)] pub mod schema; pub mod search; +pub mod signups; pub mod tags; pub mod timeline; pub mod users; diff --git a/plume-models/src/signups.rs b/plume-models/src/signups.rs new file mode 100644 index 00000000..07bdff15 --- /dev/null +++ b/plume-models/src/signups.rs @@ -0,0 +1,45 @@ +use std::fmt; +use std::str::FromStr; + +pub enum Strategy { + Password, + Email, +} + +impl Default for Strategy { + fn default() -> Self { + Self::Password + } +} + +impl FromStr for Strategy { + type Err = StrategyError; + + fn from_str(s: &str) -> Result { + use self::Strategy::*; + + match s { + "password" => Ok(Password), + "email" => Ok(Email), + s => Err(StrategyError::Unsupported(s.to_string())), + } + } +} + +#[derive(Debug)] +pub enum StrategyError { + Unsupported(String), +} + +impl fmt::Display for StrategyError { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + use self::StrategyError::*; + + match self { + // FIXME: Calc option strings from enum + Unsupported(s) => write!(f, "Unsupported strategy: {}. Choose password or email", s), + } + } +} + +impl std::error::Error for StrategyError {}