From c088cbfe4de6fc3e8d3936be30ec105e427bc959 Mon Sep 17 00:00:00 2001 From: Andrey 0xdc09 <50486086+DarkCat09@users.noreply.github.com> Date: Thu, 5 Mar 2026 13:17:37 +0400 Subject: [PATCH] refactor: use enum for mode cli arg (#83) --- filtermail/src/main.rs | 31 ++++++++++++++++++++++++++----- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/filtermail/src/main.rs b/filtermail/src/main.rs index 8d5899f6..1992f23c 100644 --- a/filtermail/src/main.rs +++ b/filtermail/src/main.rs @@ -46,6 +46,24 @@ use std::sync::Arc; const ENCRYPTION_NEEDED_523: &str = "523 Encryption Needed: Invalid Unencrypted Mail"; +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +enum Mode { + Outgoing, + Incoming, +} + +impl std::str::FromStr for Mode { + type Err = &'static str; + + fn from_str(s: &str) -> Result { + match s { + "outgoing" => Ok(Mode::Outgoing), + "incoming" => Ok(Mode::Incoming), + _ => Err("Error: mode must be 'incoming' or 'outgoing'"), + } + } +} + #[tokio::main] async fn main() { // default to info level @@ -72,10 +90,13 @@ async fn main() { unreachable!("args length checked above") }; - if mode != "incoming" && mode != "outgoing" { - eprintln!("Error: mode must be 'incoming' or 'outgoing'"); - process::exit(1); - } + let mode = match mode.parse::() { + Ok(mode) => mode, + Err(e) => { + eprintln!("{e}"); + process::exit(1); + } + }; let config = match Config::from_file(config_path) { Ok(c) => c, @@ -85,7 +106,7 @@ async fn main() { } }; - if mode == "outgoing" { + if mode == Mode::Outgoing { let handler = Arc::new(OutgoingBeforeQueueHandler::new(config.clone())); let addr = format!("127.0.0.1:{}", config.filtermail_smtp_port); let max_size = config.max_message_size;