use crate::secrecy::{ExposeSecret, SecretString}; pub struct Builder { decryption_key: SecretString, needs_password: bool, file_name: Option, language: Option, } impl Builder { #[must_use] pub fn new(decryption_key: SecretString) -> Self { Self { decryption_key, needs_password: false, file_name: None, language: None, } } #[must_use] pub const fn needs_password(mut self) -> Self { self.needs_password = true; self } // False positive #[allow(clippy::missing_const_for_fn)] #[must_use] pub fn file_name(mut self, name: String) -> Self { self.file_name = Some(name); self } // False positive #[allow(clippy::missing_const_for_fn)] #[must_use] pub fn language(mut self, language: String) -> Self { self.language = Some(language); self } #[must_use] pub fn build(self) -> SecretString { if !self.needs_password && self.file_name.is_none() && self.language.is_none() { return self.decryption_key; } let mut args = String::new(); if self.needs_password { args.push_str("!pw"); } if let Some(file_name) = self.file_name { args.push_str("!name:"); args.push_str(&file_name); } if let Some(language) = self.language { args.push_str("!lang:"); args.push_str(&language); } SecretString::new(format!( "key:{}{}", self.decryption_key.expose_secret(), args )) } }