opensmtpd-filter-dkimout/src/config.rs

55 lines
1.5 KiB
Rust
Raw Normal View History

2023-03-26 17:15:41 +02:00
use crate::algorithm::Algorithm;
2023-03-26 16:30:53 +02:00
use crate::canonicalization::Canonicalization;
2023-03-26 16:07:49 +02:00
use clap::Parser;
use std::collections::HashSet;
use std::fs::File;
//use std::io::BufReader;
use std::io::{BufRead, BufReader};
use std::path::PathBuf;
#[derive(Parser, Debug)]
#[command(author, version, about, long_about = None)]
pub struct Config {
2023-03-26 17:15:41 +02:00
#[arg(short, long, default_value_t = Algorithm::default())]
algorithm: Algorithm,
2023-03-26 16:30:53 +02:00
#[arg(short, long, default_value_t = Canonicalization::default())]
canonicalization: Canonicalization,
2023-03-26 16:07:49 +02:00
#[arg(short, long)]
domain: Vec<String>,
#[arg(short = 'D', long, value_name = "FILE")]
domain_file: Option<PathBuf>,
#[arg(short, long, value_name = "FILE")]
revocation_list: Option<PathBuf>,
}
impl Config {
pub fn init() -> Result<Self, String> {
let mut cnf = Self::parse();
let mut domain_set: HashSet<String> = cnf.domain.into_iter().collect();
if let Some(path) = &cnf.domain_file {
let f = File::open(path).map_err(|e| format!("{}: {e}", path.display()))?;
for line in BufReader::new(f).lines() {
let line = line.map_err(|e| format!("{}: {e}", path.display()))?;
let domain = line.trim();
if !domain.is_empty() && !domain.starts_with('#') {
domain_set.insert(domain.to_string());
}
}
}
cnf.domain = domain_set.into_iter().collect::<Vec<_>>();
Ok(cnf)
}
2023-03-26 17:15:41 +02:00
pub fn algorithm(&self) -> Algorithm {
self.algorithm
}
2023-03-26 16:30:53 +02:00
pub fn canonicalization(&self) -> Canonicalization {
self.canonicalization
}
2023-03-26 16:07:49 +02:00
pub fn domains(&self) -> &[String] {
&self.domain
}
}