use std::path::PathBuf;
use clap::Args;
use crate::{
constants::{
ASTERISK, DEFAULT_HTTP_TIMEOUT, DEFAULT_MODULE_CONCURRENCY, DEFAULT_RESOLVER_CONCURRENCY,
DEFAULT_RESOLVER_TIMEOUT, DEFAULT_USER_AGENT,
},
enums::{cache::CacheFilter, output::OutputFormat},
};
#[derive(Args, Clone, Debug, Default)]
pub struct ScanCommandArgs {
#[arg(short, long)]
pub domain: String,
#[arg(short, long, default_value = DEFAULT_USER_AGENT)]
pub user_agent: String,
#[arg(short = 't', long, default_value_t = DEFAULT_HTTP_TIMEOUT.as_secs())]
pub http_timeout: u64,
#[arg(short, long, default_value = None)]
pub proxy: Option<String>,
#[arg(value_enum, short, long, default_value_t = OutputFormat::JSON)]
pub output: OutputFormat,
#[arg(long, default_value_t = false)]
pub print: bool,
#[arg(short = 'c', long, default_value_t = DEFAULT_MODULE_CONCURRENCY)]
pub module_concurrency: u64,
#[arg(long, default_value_t = DEFAULT_RESOLVER_TIMEOUT.as_millis() as u64)]
pub resolver_timeout: u64,
#[arg(long, default_value_t = DEFAULT_RESOLVER_CONCURRENCY)]
pub resolver_concurrency: u64,
#[arg(long, default_value = None)]
pub resolver_list: Option<PathBuf>,
#[arg(long = "disable-ip-resolve", default_value_t = false)]
pub resolver_disabled: bool,
#[arg(short, long, default_value = ASTERISK)]
pub modules: String,
#[arg(short, long, default_value = "")]
pub skips: String,
}
impl ScanCommandArgs {
pub fn filter(&self) -> CacheFilter {
let filter_empty = |module: &str| {
if !module.trim().is_empty() {
Some(module.trim().to_lowercase())
} else {
None
}
};
let split = self.modules.trim().split(",");
let modules = split.filter_map(filter_empty).collect();
let split = self.skips.trim().split(",");
let skips = split.filter_map(filter_empty).collect();
if self.modules == ASTERISK && self.skips.is_empty() {
CacheFilter::NoFilter
} else if self.modules == ASTERISK && !self.skips.is_empty() {
CacheFilter::FilterByName((vec![], skips).into())
} else {
CacheFilter::FilterByName((modules, skips).into())
}
}
}