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 }