use std::{net::SocketAddr, path::PathBuf, time::Duration};
use clap::Args;
use onomancy_dnssec::dns_name::DnsName;
use crate::{
resolve::{ResolveError, stateful_pass},
say,
};
#[derive(Debug, Args)]
pub(crate) struct Watch {
#[arg(long)]
hostname: String,
#[arg(long)]
store: PathBuf,
#[arg(long)]
resolver: Option<SocketAddr>,
#[arg(long, default_value_t = 300)]
interval: u64,
#[arg(long)]
passes: Option<u64>,
}
impl Watch {
pub(crate) fn run(&self) -> Result<(), ResolveError> {
let hostname = DnsName::parse_display(&self.hostname)?;
let mut remaining = self.passes;
loop {
if let Err(failure) = stateful_pass(self.resolver, &self.store, &hostname, None, &[]) {
say(&format!("pass failed: {failure}"));
}
match &mut remaining {
Some(0 | 1) => return Ok(()),
Some(count) => *count -= 1,
None => (),
}
std::thread::sleep(Duration::from_secs(self.interval));
}
}
}