33use asimov_module:: SysexitsError :: { self , * } ;
44use asimov_x_module:: api:: x:: XClient ;
55use asimov_x_module:: providers:: x:: extract_list_id_from_url;
6- use clap:: { Parser , Subcommand } ;
6+ use clap:: Parser ;
77use clientele:: StandardOptions ;
88use std:: error:: Error ;
99
@@ -12,22 +12,16 @@ struct Options {
1212 #[ clap( flatten) ]
1313 flags : StandardOptions ,
1414
15- #[ clap( subcommand) ]
16- command : Option < Commands > ,
17- }
18-
19- #[ derive( Debug , Subcommand ) ]
20- enum Commands {
21- #[ clap( about = "Catalog X list members from a list URL." ) ]
22- GetListMembers {
23- url : String ,
15+ /// X list URL to catalog
16+ url : Option < String > ,
2417
25- #[ clap( short, long) ]
26- limit : Option < usize > ,
18+ /// Limit the number of members to fetch
19+ #[ clap( short, long) ]
20+ limit : Option < usize > ,
2721
28- # [ clap ( short , long , default_value = " jsonl" ) ]
29- output : String ,
30- } ,
22+ /// Output format (json or jsonl)
23+ # [ clap ( short , long , default_value = "jsonl" ) ]
24+ output : String ,
3125}
3226
3327pub fn main ( ) -> Result < SysexitsError , Box < dyn Error > > {
@@ -45,62 +39,60 @@ pub fn main() -> Result<SysexitsError, Box<dyn Error>> {
4539 return Ok ( EX_OK ) ;
4640 }
4741
42+ // Check if URL is provided
43+ let url = options. url . ok_or_else ( || {
44+ eprintln ! ( "Error: URL is required. Use --help for usage information." ) ;
45+ EX_USAGE
46+ } ) ?;
47+
4848 #[ cfg( feature = "tracing" ) ]
4949 asimov_module:: init_tracing_subscriber ( & options. flags ) . expect ( "failed to initialize logging" ) ;
5050
51- match options. command {
52- Some ( Commands :: GetListMembers { url, limit, output } ) => {
53- let output_format = if output == "json" || output == "jsonl" {
54- output
51+ let output_format = if options. output == "json" || options. output == "jsonl" {
52+ options. output
53+ } else {
54+ eprintln ! (
55+ "Warning: Invalid output format '{}'. Using 'jsonl' instead." ,
56+ options. output
57+ ) ;
58+ "jsonl" . to_string ( )
59+ } ;
60+
61+ let list_id = extract_list_id_from_url ( & url)
62+ . ok_or_else ( || anyhow:: anyhow!( "Invalid X list URL: {}" , url) ) ?;
63+
64+ let client = XClient :: new ( ) ?;
65+ let api_response = client. fetch_list_members ( & list_id, options. limit ) ?;
66+
67+ let filter = asimov_x_module:: jq:: x_list ( ) ;
68+ let transformed = filter
69+ . filter_json ( serde_json:: to_value ( api_response) ?)
70+ . map_err ( |e| anyhow:: anyhow!( "JQ filter error: {}" , e) ) ?;
71+
72+ match output_format. as_str ( ) {
73+ "jsonl" => {
74+ if let Some ( members) = transformed[ "members" ] [ "items" ] . as_array ( ) {
75+ for member in members {
76+ println ! ( "{}" , serde_json:: to_string( member) ?) ;
77+ }
78+ }
79+ } ,
80+ "json" => {
81+ if cfg ! ( feature = "pretty" ) {
82+ colored_json:: write_colored_json ( & transformed, & mut std:: io:: stdout ( ) ) ?;
83+ println ! ( ) ;
5584 } else {
56- eprintln ! (
57- "Warning: Invalid output format '{}'. Using 'jsonl' instead." ,
58- output
59- ) ;
60- "jsonl" . to_string ( )
61- } ;
62-
63- let list_id = extract_list_id_from_url ( & url)
64- . ok_or_else ( || anyhow:: anyhow!( "Invalid X list URL: {}" , url) ) ?;
65-
66- let client = XClient :: new ( ) ?;
67- let api_response = client. fetch_list_members ( & list_id, limit) ?;
68-
69- let filter = asimov_x_module:: jq:: x_list ( ) ;
70- let transformed = filter
71- . filter_json ( serde_json:: to_value ( api_response) ?)
72- . map_err ( |e| anyhow:: anyhow!( "JQ filter error: {}" , e) ) ?;
73-
74- match output_format. as_str ( ) {
75- "jsonl" => {
76- if let Some ( members) = transformed[ "members" ] [ "items" ] . as_array ( ) {
77- for member in members {
78- println ! ( "{}" , serde_json:: to_string( member) ?) ;
79- }
80- }
81- } ,
82- "json" => {
83- if cfg ! ( feature = "pretty" ) {
84- colored_json:: write_colored_json ( & transformed, & mut std:: io:: stdout ( ) ) ?;
85- println ! ( ) ;
86- } else {
87- println ! ( "{}" , serde_json:: to_string( & transformed) ?) ;
88- }
89- } ,
90- _ => {
91- if let Some ( members) = transformed[ "members" ] [ "items" ] . as_array ( ) {
92- for member in members {
93- println ! ( "{}" , serde_json:: to_string( member) ?) ;
94- }
95- }
96- } ,
97- } ;
85+ println ! ( "{}" , serde_json:: to_string( & transformed) ?) ;
86+ }
9887 } ,
99- None => {
100- eprintln ! ( "No command specified. Use --help for usage information." ) ;
101- return Ok ( EX_USAGE ) ;
88+ _ => {
89+ if let Some ( members) = transformed[ "members" ] [ "items" ] . as_array ( ) {
90+ for member in members {
91+ println ! ( "{}" , serde_json:: to_string( member) ?) ;
92+ }
93+ }
10294 } ,
103- }
95+ } ;
10496
10597 Ok ( EX_OK )
10698}
0 commit comments