67 lines
1.6 KiB
Rust
67 lines
1.6 KiB
Rust
use crate::secrecy::{ExposeSecret, SecretString};
|
|
|
|
pub struct Builder {
|
|
decryption_key: SecretString,
|
|
needs_password: bool,
|
|
file_name: Option<String>,
|
|
language: Option<String>,
|
|
}
|
|
|
|
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
|
|
))
|
|
}
|
|
}
|