bgpfu_cli/
cli.rs

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/// Entry-point function for the `bgpfu` CLI tool.
16#[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/// An IRR query and filter generation toolset.
32#[derive(Debug, Parser)]
33#[command(author, version, about, long_about = None)]
34struct Cli {
35    /// IRRd server hostname or IP address.
36    #[arg(short = 'H', long, default_value = "whois.radb.net")]
37    host: String,
38
39    /// IRRd server port.
40    #[arg(short = 'P', long, default_value_t = 43)]
41    port: u16,
42
43    #[command(flatten)]
44    verbosity: Verbosity<WarnLevel>,
45
46    /// Output format.
47    #[arg(short, long, value_enum, default_value_t = Format::Plain)]
48    format: Format,
49
50    /// RPSL mp-filter expression to evaluate.
51    filter: MpFilterExpr,
52}
53
54impl Cli {
55    /// Get the IRRd server hostname.
56    #[must_use]
57    fn host(&self) -> &str {
58        &self.host
59    }
60
61    /// Get the IRRd server port number.
62    #[must_use]
63    const fn port(&self) -> u16 {
64        self.port
65    }
66
67    /// Get object to query.
68    #[allow(clippy::missing_const_for_fn)]
69    #[must_use]
70    fn filter(self) -> MpFilterExpr {
71        self.filter
72    }
73}