11use std:: marker:: PhantomData ;
22
33use clap:: { Args , Parser } ;
4+ use lum_log:: { error, info} ;
45use thiserror:: Error ;
56
67use crate :: {
78 Config ,
89 cli:: ExecutableCommand ,
910 config:: provider:: Provider as ProviderConfig ,
10- provider:: { GetAllRecordsInput , GetRecordsInput , Provider , nitrado:: NitradoProvider } ,
11+ provider:: {
12+ GetAllRecordsInput , GetRecordsInput , Provider , hetzner:: HetznerProvider ,
13+ netcup:: NetcupProvider , nitrado:: NitradoProvider ,
14+ } ,
1115} ;
1216
1317#[ derive( Debug ) ]
@@ -25,15 +29,14 @@ pub enum Error {
2529 ProviderError ( #[ from] anyhow:: Error ) ,
2630}
2731
28- //TODO: Fix order of usage message (provider should come first)
2932#[ derive( Debug , Args ) ]
30- #[ group( required = true , multiple = false ) ]
3133pub struct SubdomainArgs {
3234 /// Subdomains to get records for
35+ #[ clap( display_order = 3 ) ]
3336 subdomains : Vec < String > ,
3437
3538 /// Get all records
36- #[ clap( short, long, default_value = "false" ) ]
39+ #[ clap( short, long, default_value = "false" , display_order = 3 ) ]
3740 pub all : bool ,
3841}
3942
@@ -45,9 +48,11 @@ pub struct Command<'command> {
4548 _phantom : PhantomData < & ' command ( ) > ,
4649
4750 /// Name of the provider to get records from
51+ #[ clap( display_order = 1 ) ]
4852 provider : String ,
4953
5054 /// Domain to get records for
55+ #[ clap( display_order = 2 ) ]
5156 domain : String ,
5257
5358 #[ command( flatten) ]
@@ -59,13 +64,23 @@ fn get_provider<'config>(
5964 name : & str ,
6065 config : & ' config Config ,
6166) -> Option < Box < dyn Provider + ' config > > {
62- for provider_file_config in config. providers . iter ( ) {
63- match & provider_file_config . provider {
67+ for provider in config. providers . iter ( ) {
68+ match provider {
6469 ProviderConfig :: Nitrado ( nitrado_config) => {
6570 if name == nitrado_config. name {
6671 return Some ( Box :: new ( NitradoProvider :: new ( nitrado_config) ) ) ;
6772 }
6873 }
74+ ProviderConfig :: Hetzner ( hetzner_config) => {
75+ if name == hetzner_config. name {
76+ return Some ( Box :: new ( HetznerProvider :: new ( hetzner_config) ) ) ;
77+ }
78+ }
79+ ProviderConfig :: Netcup ( netcup_config) => {
80+ if name == netcup_config. name {
81+ return Some ( Box :: new ( NetcupProvider :: new ( netcup_config) ) ) ;
82+ }
83+ }
6984 }
7085 }
7186
@@ -77,6 +92,20 @@ impl<'command> ExecutableCommand<'command> for Command<'command> {
7792 type R = Result < ( ) , Error > ;
7893
7994 async fn execute ( & self , input : & ' command Self :: I ) -> Self :: R {
95+ if self . subdomain_args . all && !self . subdomain_args . subdomains . is_empty ( ) {
96+ error ! ( "Cannot specify both --all and specific subdomains" ) ;
97+ return Err ( Error :: ProviderError ( anyhow:: anyhow!(
98+ "Cannot specify both --all and specific subdomains"
99+ ) ) ) ;
100+ }
101+
102+ if !self . subdomain_args . all && self . subdomain_args . subdomains . is_empty ( ) {
103+ error ! ( "Must specify either --all or specific subdomains" ) ;
104+ return Err ( Error :: ProviderError ( anyhow:: anyhow!(
105+ "Must specify either --all or specific subdomains"
106+ ) ) ) ;
107+ }
108+
80109 let config = input. config ;
81110 let provider_name = self . provider . as_str ( ) ;
82111
@@ -109,13 +138,13 @@ impl<'command> ExecutableCommand<'command> for Command<'command> {
109138
110139 let records = match results {
111140 Err ( e) => {
112- eprintln ! ( "Error: {}" , e) ;
141+ error ! ( "Error: {}" , e) ;
113142 return Err ( e. into ( ) ) ;
114143 }
115144 Ok ( records) => records,
116145 } ;
117146
118- println ! ( "Records: {:#?}" , records) ;
147+ info ! ( "Records: {:#?}" , records) ;
119148 Ok ( ( ) )
120149 }
121150}
0 commit comments