11use anyhow:: { anyhow, Result } ;
22use clap:: Parser ;
3- use log:: { info, warn} ;
3+ use clap:: ValueEnum ;
4+ use log:: { info, warn, debug, trace} ;
45use reqwest:: blocking:: Client ;
56use serde:: Deserialize ;
67use std:: net:: IpAddr ;
@@ -18,6 +19,9 @@ struct Args {
1819 #[ arg( short, long) ]
1920 verbose : bool ,
2021
22+ #[ arg( long, value_enum) ]
23+ log_level : Option < LogLevel > ,
24+
2125 #[ arg( short, long) ]
2226 config : Option < String > ,
2327
@@ -31,6 +35,15 @@ struct Args {
3135 dry_run : bool ,
3236}
3337
38+ #[ derive( Copy , Clone , PartialEq , Eq , PartialOrd , Ord , ValueEnum ) ]
39+ enum LogLevel {
40+ Error ,
41+ Warn ,
42+ Info ,
43+ Debug ,
44+ Trace ,
45+ }
46+
3447#[ derive( Debug , Deserialize ) ]
3548struct Record {
3649 record : String ,
@@ -52,6 +65,18 @@ struct DreamhostClient {
5265 api_key : String ,
5366}
5467
68+ impl From < LogLevel > for log:: LevelFilter {
69+ fn from ( level : LogLevel ) -> Self {
70+ match level {
71+ LogLevel :: Error => log:: LevelFilter :: Error ,
72+ LogLevel :: Warn => log:: LevelFilter :: Warn ,
73+ LogLevel :: Info => log:: LevelFilter :: Info ,
74+ LogLevel :: Debug => log:: LevelFilter :: Debug ,
75+ LogLevel :: Trace => log:: LevelFilter :: Trace ,
76+ }
77+ }
78+ }
79+
5580impl DreamhostClient {
5681 fn call ( & self , params : & [ ( & str , & str ) ] ) -> Result < serde_json:: Value > {
5782 let mut query = vec ! [
@@ -85,6 +110,9 @@ impl DreamhostClient {
85110
86111 let records: Vec < Record > = serde_json:: from_value ( resp[ "data" ] . clone ( ) ) ?;
87112
113+ debug ! ( "All DNS records: {:?}" , records) ;
114+ trace ! ( "Detailed DNS data: {:?}" , resp) ;
115+
88116 records
89117 . into_iter ( )
90118 . find ( |r| r. record == record_name && r. record_type == "A" )
@@ -123,13 +151,17 @@ fn main() -> Result<()> {
123151
124152 let args = Args :: parse ( ) ;
125153
126- if args. verbose {
127- env_logger :: Builder :: from_default_env ( )
128- . filter_level ( log :: LevelFilter :: Info )
129- . init ( ) ;
154+ let level = if let Some ( level ) = args. log_level {
155+ level . into ( )
156+ } else if args . verbose {
157+ log :: LevelFilter :: Info
130158 } else {
131- env_logger:: init ( ) ;
132- }
159+ log:: LevelFilter :: Warn
160+ } ;
161+
162+ env_logger:: Builder :: from_default_env ( )
163+ . filter_level ( level)
164+ . init ( ) ;
133165
134166 let config = resolve_config ( & args) ?;
135167
0 commit comments