@@ -7,6 +7,7 @@ use clap::Subcommand;
77use serde:: Serialize ;
88
99use crate :: exit_code:: ExitCode ;
10+ use crate :: output:: { Formatter , OutputConfig } ;
1011use rc_core:: { Alias , AliasManager } ;
1112
1213/// Alias subcommands for managing storage service connections
@@ -104,67 +105,44 @@ struct AliasOperationOutput {
104105}
105106
106107/// Execute an alias subcommand
107- pub async fn execute ( cmd : AliasCommands , json_output : bool ) -> ExitCode {
108+ pub async fn execute ( cmd : AliasCommands , output_config : OutputConfig ) -> ExitCode {
109+ let formatter = Formatter :: new ( output_config) ;
108110 let alias_manager = match AliasManager :: new ( ) {
109111 Ok ( am) => am,
110112 Err ( e) => {
111- if json_output {
112- eprintln ! ( "{}" , serde_json:: json!( { "error" : e. to_string( ) } ) ) ;
113- } else {
114- eprintln ! ( "Error: {e}" ) ;
115- }
113+ formatter. error ( & format ! ( "Failed to load aliases: {e}" ) ) ;
116114 return ExitCode :: GeneralError ;
117115 }
118116 } ;
119117
120118 match cmd {
121- AliasCommands :: Set ( args) => execute_set ( args, & alias_manager, json_output ) . await ,
122- AliasCommands :: List ( args) => execute_list ( args, & alias_manager, json_output ) . await ,
123- AliasCommands :: Remove ( args) => execute_remove ( args, & alias_manager, json_output ) . await ,
119+ AliasCommands :: Set ( args) => execute_set ( args, & alias_manager, & formatter ) . await ,
120+ AliasCommands :: List ( args) => execute_list ( args, & alias_manager, & formatter ) . await ,
121+ AliasCommands :: Remove ( args) => execute_remove ( args, & alias_manager, & formatter ) . await ,
124122 }
125123}
126124
127- async fn execute_set ( args : SetArgs , manager : & AliasManager , json_output : bool ) -> ExitCode {
125+ async fn execute_set ( args : SetArgs , manager : & AliasManager , formatter : & Formatter ) -> ExitCode {
128126 // Validate inputs
129127 if args. name . is_empty ( ) {
130- let msg = "Alias name cannot be empty" ;
131- if json_output {
132- eprintln ! ( "{}" , serde_json:: json!( { "error" : msg} ) ) ;
133- } else {
134- eprintln ! ( "Error: {msg}" ) ;
135- }
128+ formatter. error ( "Alias name cannot be empty" ) ;
136129 return ExitCode :: UsageError ;
137130 }
138131
139132 if args. endpoint . is_empty ( ) {
140- let msg = "Endpoint URL cannot be empty" ;
141- if json_output {
142- eprintln ! ( "{}" , serde_json:: json!( { "error" : msg} ) ) ;
143- } else {
144- eprintln ! ( "Error: {msg}" ) ;
145- }
133+ formatter. error ( "Endpoint URL cannot be empty" ) ;
146134 return ExitCode :: UsageError ;
147135 }
148136
149137 // Validate signature version
150138 if args. signature != "v4" && args. signature != "v2" {
151- let msg = "Signature must be 'v4' or 'v2'" ;
152- if json_output {
153- eprintln ! ( "{}" , serde_json:: json!( { "error" : msg} ) ) ;
154- } else {
155- eprintln ! ( "Error: {msg}" ) ;
156- }
139+ formatter. error ( "Signature must be 'v4' or 'v2'" ) ;
157140 return ExitCode :: UsageError ;
158141 }
159142
160143 // Validate bucket lookup
161144 if args. bucket_lookup != "auto" && args. bucket_lookup != "path" && args. bucket_lookup != "dns" {
162- let msg = "Bucket lookup must be 'auto', 'path', or 'dns'" ;
163- if json_output {
164- eprintln ! ( "{}" , serde_json:: json!( { "error" : msg} ) ) ;
165- } else {
166- eprintln ! ( "Error: {msg}" ) ;
167- }
145+ formatter. error ( "Bucket lookup must be 'auto', 'path', or 'dns'" ) ;
168146 return ExitCode :: UsageError ;
169147 }
170148
@@ -183,98 +161,90 @@ async fn execute_set(args: SetArgs, manager: &AliasManager, json_output: bool) -
183161 // Save alias
184162 match manager. set ( alias) {
185163 Ok ( ( ) ) => {
186- if json_output {
164+ if formatter . is_json ( ) {
187165 let output = AliasOperationOutput {
188166 success : true ,
189167 alias : args. name . clone ( ) ,
190168 message : format ! ( "Alias '{}' configured successfully" , args. name) ,
191169 } ;
192- println ! ( "{}" , serde_json :: to_string_pretty ( & output) . unwrap ( ) ) ;
170+ formatter . json ( & output) ;
193171 } else {
194- println ! ( "Alias '{}' configured successfully." , args. name) ;
172+ let styled_name = formatter. style_name ( & args. name ) ;
173+ formatter. success ( & format ! ( "Alias '{styled_name}' configured successfully." ) ) ;
195174 }
196175 ExitCode :: Success
197176 }
198177 Err ( e) => {
199- if json_output {
200- eprintln ! ( "{}" , serde_json:: json!( { "error" : e. to_string( ) } ) ) ;
201- } else {
202- eprintln ! ( "Error: {e}" ) ;
203- }
178+ formatter. error ( & e. to_string ( ) ) ;
204179 ExitCode :: GeneralError
205180 }
206181 }
207182}
208183
209- async fn execute_list ( args : ListArgs , manager : & AliasManager , json_output : bool ) -> ExitCode {
184+ async fn execute_list ( args : ListArgs , manager : & AliasManager , formatter : & Formatter ) -> ExitCode {
210185 match manager. list ( ) {
211186 Ok ( aliases) => {
212- if json_output {
187+ if formatter . is_json ( ) {
213188 let output = AliasListOutput {
214189 aliases : aliases. iter ( ) . map ( AliasInfo :: from) . collect ( ) ,
215190 } ;
216- println ! ( "{}" , serde_json :: to_string_pretty ( & output) . unwrap ( ) ) ;
191+ formatter . json ( & output) ;
217192 } else if aliases. is_empty ( ) {
218- println ! ( "No aliases configured." ) ;
193+ formatter . println ( "No aliases configured." ) ;
219194 } else if args. long {
220195 // Long format with details
221196 for alias in & aliases {
222- println ! (
223- "{:<12} {} (region: {}, lookup: {})" ,
224- alias. name, alias. endpoint, alias. region, alias. bucket_lookup
225- ) ;
197+ let styled_name = formatter. style_name ( & format ! ( "{:<12}" , alias. name) ) ;
198+ let styled_url = formatter. style_url ( & alias. endpoint ) ;
199+ let styled_region = formatter. style_date ( & alias. region ) ;
200+ let styled_lookup = formatter. style_date ( & alias. bucket_lookup ) ;
201+ formatter. println ( & format ! (
202+ "{styled_name} {styled_url} (region: {styled_region}, lookup: {styled_lookup})"
203+ ) ) ;
226204 }
227205 } else {
228206 // Short format
229207 for alias in & aliases {
230- println ! ( "{:<12} {}" , alias. name, alias. endpoint) ;
208+ let styled_name = formatter. style_name ( & format ! ( "{:<12}" , alias. name) ) ;
209+ let styled_url = formatter. style_url ( & alias. endpoint ) ;
210+ formatter. println ( & format ! ( "{styled_name} {styled_url}" ) ) ;
231211 }
232212 }
233213 ExitCode :: Success
234214 }
235215 Err ( e) => {
236- if json_output {
237- eprintln ! ( "{}" , serde_json:: json!( { "error" : e. to_string( ) } ) ) ;
238- } else {
239- eprintln ! ( "Error: {e}" ) ;
240- }
216+ formatter. error ( & e. to_string ( ) ) ;
241217 ExitCode :: GeneralError
242218 }
243219 }
244220}
245221
246- async fn execute_remove ( args : RemoveArgs , manager : & AliasManager , json_output : bool ) -> ExitCode {
222+ async fn execute_remove (
223+ args : RemoveArgs ,
224+ manager : & AliasManager ,
225+ formatter : & Formatter ,
226+ ) -> ExitCode {
247227 match manager. remove ( & args. name ) {
248228 Ok ( ( ) ) => {
249- if json_output {
229+ if formatter . is_json ( ) {
250230 let output = AliasOperationOutput {
251231 success : true ,
252232 alias : args. name . clone ( ) ,
253233 message : format ! ( "Alias '{}' removed successfully" , args. name) ,
254234 } ;
255- println ! ( "{}" , serde_json :: to_string_pretty ( & output) . unwrap ( ) ) ;
235+ formatter . json ( & output) ;
256236 } else {
257- println ! ( "Alias '{}' removed successfully." , args. name) ;
237+ let styled_name = formatter. style_name ( & args. name ) ;
238+ formatter. success ( & format ! ( "Alias '{styled_name}' removed successfully." ) ) ;
258239 }
259240 ExitCode :: Success
260241 }
261242 Err ( rc_core:: Error :: AliasNotFound ( _) ) => {
262- if json_output {
263- eprintln ! (
264- "{}" ,
265- serde_json:: json!( { "error" : format!( "Alias '{}' not found" , args. name) } )
266- ) ;
267- } else {
268- eprintln ! ( "Error: Alias '{}' not found." , args. name) ;
269- }
243+ formatter. error ( & format ! ( "Alias '{}' not found" , args. name) ) ;
270244 ExitCode :: NotFound
271245 }
272246 Err ( e) => {
273- if json_output {
274- eprintln ! ( "{}" , serde_json:: json!( { "error" : e. to_string( ) } ) ) ;
275- } else {
276- eprintln ! ( "Error: {e}" ) ;
277- }
247+ formatter. error ( & e. to_string ( ) ) ;
278248 ExitCode :: GeneralError
279249 }
280250 }
0 commit comments