/ src / args.rs
args.rs
 1  use clap::Parser;
 2  use std::net::{Ipv4Addr, SocketAddr};
 3  
 4  #[derive(Debug, Parser)]
 5  #[command(author, version, about, long_about = None)]
 6  pub struct Args {
 7      /// Address to bind to
 8      #[arg(default_value_t = default_bind_addr(), long)]
 9      pub address: SocketAddr,
10  
11      #[arg(long)]
12      pub latitude: f64,
13  
14      #[arg(long)]
15      pub longitude: f64,
16  
17      #[arg(long, value_parser = url_parser)]
18      pub push_gateway: reqwest::Url,
19  }
20  
21  impl Args {
22      pub fn push_url(&self) -> reqwest::Url {
23          self.push_gateway
24              .join(&format!(
25                  "metrics/job/ambient%20weather/instance/{}",
26                  self.address
27              ))
28              .expect("Unable to construct push URL")
29      }
30  }
31  
32  fn default_bind_addr() -> SocketAddr {
33      SocketAddr::new(std::net::IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0)), 9111)
34  }
35  
36  fn url_parser(arg: &str) -> Result<reqwest::Url, clap::Error> {
37      reqwest::Url::parse(arg).map_err(|e| {
38          clap::Error::raw(
39              clap::error::ErrorKind::InvalidValue,
40              format!("{arg:?} is not a URL ({e:?})"),
41          )
42      })
43  }