1use bgpfu::RpslEvaluator;
2
3use clap::Parser;
4
5use clap_verbosity_flag::{Verbosity, WarnLevel};
6
7use ip::traits::PrefixSet as _;
8
9use rpsl::expr::MpFilterExpr;
10
11use tracing_log::AsTrace;
12
13use crate::Format;
14
15#[allow(clippy::missing_errors_doc)]
17pub fn main() -> anyhow::Result<()> {
18 let args = Cli::parse();
19 tracing_subscriber::fmt()
20 .with_writer(std::io::stderr)
21 .with_max_level(args.verbosity.log_level_filter().as_trace())
22 .try_init()
23 .map_err(|err| anyhow::anyhow!(err))?;
24 RpslEvaluator::new(args.host(), args.port())?
25 .evaluate(args.filter())?
26 .ranges()
27 .for_each(|range| println!("{range}"));
28 Ok(())
29}
30
31#[derive(Debug, Parser)]
33#[command(author, version, about, long_about = None)]
34struct Cli {
35 #[arg(short = 'H', long, default_value = "whois.radb.net")]
37 host: String,
38
39 #[arg(short = 'P', long, default_value_t = 43)]
41 port: u16,
42
43 #[command(flatten)]
44 verbosity: Verbosity<WarnLevel>,
45
46 #[arg(short, long, value_enum, default_value_t = Format::Plain)]
48 format: Format,
49
50 filter: MpFilterExpr,
52}
53
54impl Cli {
55 #[must_use]
57 fn host(&self) -> &str {
58 &self.host
59 }
60
61 #[must_use]
63 const fn port(&self) -> u16 {
64 self.port
65 }
66
67 #[allow(clippy::missing_const_for_fn)]
69 #[must_use]
70 fn filter(self) -> MpFilterExpr {
71 self.filter
72 }
73}