use zond_engine::{PortSet, scan};
use crate::cli::ScanArgs;
use crate::command;
use crate::error::Error;
use crate::exit::Outcome;
use crate::render::{Phase, Renderer};
use crate::target;
const DEFAULT_PORTS: &str = "1-1024";
pub(crate) async fn run(args: &ScanArgs, renderer: &mut dyn Renderer) -> Result<Outcome, Error> {
let settings = command::engine_settings(args.engine.profile.as_deref())?;
let mut config = settings.config;
args.apply_to(&mut config);
let ports = ports(args, settings.ports);
let targets = target::resolve_ports(&args.targets, ports, !config.no_dns).await?;
targets.apply_to(&mut config);
let redaction = command::redaction(&config);
renderer.started(Phase::PortScan { targets: &targets }, redaction)?;
let (session, task) = scan(targets.into_map(), &config).await?;
command::drive(session, task, renderer).await
}
fn ports(args: &ScanArgs, configured: Option<PortSet>) -> PortSet {
args.ports.clone().or(configured).unwrap_or_else(|| {
DEFAULT_PORTS
.parse()
.expect("the built-in default is a port specification")
})
}