22# FYI: CLI
33*/
44
5- use argyle:: {
6- Argue ,
7- Argument ,
8- } ;
5+ use argyle:: argue;
96use crate :: FyiError ;
107use dactyl:: traits:: BytesToUnsigned ;
118use fyi_msg:: {
9+ CliCommandArg ,
1210 Msg ,
1311 MsgKind ,
1412} ;
@@ -22,6 +20,9 @@ use std::{
2220// Flags generated by build.rs.
2321include ! ( concat!( env!( "OUT_DIR" ) , "/flags.rs" ) ) ;
2422
23+ /// # Remaining CLI Args.
24+ type RemainingArgs = std:: iter:: Skip < std:: env:: ArgsOs > ;
25+
2526
2627
2728#[ derive( Debug , Clone , Copy ) ]
@@ -65,43 +66,57 @@ impl Settings {
6566
6667
6768/// # Parse Message Kind.
68- pub ( super ) fn parse_kind ( ) -> Result < MsgKind , FyiError > {
69- let mut args = argyle:: args ( ) . with_keywords (
70- include ! ( concat!( env!( "OUT_DIR" ) , "/argyle-kind.rs" ) )
71- ) ;
69+ pub ( super ) fn parse_kind ( ) -> Result < ( MsgKind , RemainingArgs ) , FyiError > {
70+ let mut args = CliCommandArg :: args_os ( ) ;
7271
7372 // The first result must be a subcommand or help/version flag.
7473 let kind = match args. next ( ) {
75- Some ( Argument :: Key ( "-V" | "--version" ) ) => return Err ( FyiError :: PrintVersion ) ,
76- Some ( Argument :: Command ( s) ) => MsgKind :: from ( s. as_bytes ( ) ) ,
77- _ => return Err ( FyiError :: PrintHelp ( MsgKind :: None ) ) ,
74+ Some ( CliCommandArg :: Blank ) => MsgKind :: Blank ,
75+ Some ( CliCommandArg :: Confirm ) => MsgKind :: Confirm ,
76+ Some ( CliCommandArg :: Custom ) => MsgKind :: Custom ,
77+ Some ( CliCommandArg :: Aborted ) => MsgKind :: Aborted ,
78+ Some ( CliCommandArg :: Crunched ) => MsgKind :: Crunched ,
79+ Some ( CliCommandArg :: Debug ) => MsgKind :: Debug ,
80+ Some ( CliCommandArg :: Done ) => MsgKind :: Done ,
81+ Some ( CliCommandArg :: Error ) => MsgKind :: Error ,
82+ Some ( CliCommandArg :: Found ) => MsgKind :: Found ,
83+ Some ( CliCommandArg :: Info ) => MsgKind :: Info ,
84+ Some ( CliCommandArg :: Notice ) => MsgKind :: Notice ,
85+ Some ( CliCommandArg :: Review ) => MsgKind :: Review ,
86+ Some ( CliCommandArg :: Skipped ) => MsgKind :: Skipped ,
87+ Some ( CliCommandArg :: Success ) => MsgKind :: Success ,
88+ Some ( CliCommandArg :: Task ) => MsgKind :: Task ,
89+ Some ( CliCommandArg :: Warning ) => MsgKind :: Warning ,
90+ Some ( CliCommandArg :: Version ) => return Err ( FyiError :: PrintVersion ) ,
91+ Some ( CliCommandArg :: Other ( _) | CliCommandArg :: OtherOs ( _) ) | None => return Err ( FyiError :: PrintHelp ( MsgKind :: None ) ) ,
7892 } ;
7993
80- // Force the help screen if no kind was parsed.
81- if matches ! ( kind, MsgKind :: None ) { Err ( FyiError :: PrintHelp ( MsgKind :: None ) ) }
82- // Otherwise return it!
83- else { Ok ( kind) }
94+ Ok ( ( kind, args. into_inner ( ) ) )
8495}
8596
8697/// # Parse and Print Blanks!
87- pub ( super ) fn parse_blank ( ) -> Result < ( ) , FyiError > {
88- // The first arg is always skipped, the second we read earlier.
89- let args = Argue :: from ( std:: env:: args_os ( ) . skip ( 2 ) )
90- . with_keywords ( include ! ( concat!( env!( "OUT_DIR" ) , "/argyle-blank.rs" ) ) ) ;
98+ pub ( super ) fn parse_blank ( args : RemainingArgs ) -> Result < ( ) , FyiError > {
99+ argue ! {
100+ Help "-h" "--help" ,
101+ Stderr "--stderr" ,
102+ @options
103+ Count "-c" "--count" ,
104+ }
91105
106+ // The first arg is always skipped, the second we read earlier.
92107 let mut stderr = false ;
93108 let mut count = NonZeroUsize :: MIN ;
94- for arg in args {
109+ for arg in ArgumentIter :: new ( args) {
95110 match arg {
96- Argument :: Key ( "-h" | "--help" ) => return Err ( FyiError :: PrintHelp ( MsgKind :: Blank ) ) ,
97- Argument :: Key ( "--stderr" ) => { stderr = true ; } ,
98- Argument :: KeyWithValue ( "-c" | "--count" , s) =>
111+ Argument :: Help => return Err ( FyiError :: PrintHelp ( MsgKind :: Blank ) ) ,
112+ Argument :: Stderr => { stderr = true ; } ,
113+ Argument :: Count ( s) =>
99114 if let Some ( s) = NonZeroUsize :: btou ( s. trim ( ) . as_bytes ( ) ) {
100115 count = NonZeroUsize :: max ( count, s) ;
101116 } ,
102117
103118 // Nothing else is relevant here.
104- _ => { } ,
119+ Argument :: Other ( _ ) | Argument :: OtherOs ( _ ) => { } ,
105120 }
106121 }
107122
@@ -114,35 +129,43 @@ pub(super) fn parse_blank() -> Result<(), FyiError> {
114129}
115130
116131/// # Parse Message.
117- pub ( super ) fn parse_msg ( kind : MsgKind ) -> Result < ( Msg , Settings ) , FyiError > {
118- // The first arg is always skipped, the second we read earlier.
119- let args = Argue :: from ( std:: env:: args_os ( ) . skip ( 2 ) )
120- . with_keywords ( include ! ( concat!( env!( "OUT_DIR" ) , "/argyle-msg.rs" ) ) ) ;
132+ pub ( super ) fn parse_msg ( kind : MsgKind , args : RemainingArgs )
133+ -> Result < ( Msg , Settings ) , FyiError > {
134+ argue ! {
135+ Help "-h" "--help" ,
136+ Indent "-i" "--indent" ,
137+ Stderr "--stderr" ,
138+ Timestamp "-t" "--timestamp" ,
139+ Yes "-y" "--yes" ,
140+ @options
141+ Color "-c" "--prefix-color" ,
142+ Prefix "-p" "--prefix" ,
143+ Exit "-e" "--exit" ,
144+ }
121145
122146 let mut msg = None ;
123147 let mut prefix = String :: new ( ) ;
124148 let mut color = 199_u8 ;
125149 let mut flags = Settings :: new ( ) ;
126- for arg in args {
150+ for arg in ArgumentIter :: new ( args) {
127151 match arg {
128- Argument :: Key ( "-h" | "--help" ) => return Err ( FyiError :: PrintHelp ( kind) ) ,
129- Argument :: Key ( "-i" | "--indent" ) => { flags. flags . set ( Flags :: Indent ) ; } ,
130- Argument :: Key ( "--stderr" ) => { flags. flags . set ( Flags :: Stderr ) ; } ,
131- Argument :: Key ( "-t" | "--timestamp" ) => { flags. flags . set ( Flags :: Timestamp ) ; } ,
132- Argument :: Key ( "-y" | "--yes" ) => { flags. flags . set ( Flags :: Yes ) ; } ,
152+ Argument :: Help => return Err ( FyiError :: PrintHelp ( kind) ) ,
153+ Argument :: Indent => { flags. flags . set ( Flags :: Indent ) ; } ,
154+ Argument :: Stderr => { flags. flags . set ( Flags :: Stderr ) ; } ,
155+ Argument :: Timestamp => { flags. flags . set ( Flags :: Timestamp ) ; } ,
156+ Argument :: Yes => { flags. flags . set ( Flags :: Yes ) ; } ,
133157
134- Argument :: KeyWithValue ( "-c" | "--prefix-color" , s) =>
158+ Argument :: Color ( s) =>
135159 if let Some ( s) = u8:: btou ( s. trim ( ) . as_bytes ( ) ) { color = s; } ,
136- Argument :: KeyWithValue ( "-p" | "--prefix" , s) => { prefix = s; } ,
137- Argument :: KeyWithValue ( "-e" | "--exit" , s) =>
160+ Argument :: Prefix ( s) => { prefix = s; } ,
161+ Argument :: Exit ( s) =>
138162 if let Some ( s) = u8:: btou ( s. trim ( ) . as_bytes ( ) ) { flags. exit = s. into ( ) ; } ,
139163
140164 Argument :: Other ( s) =>
141165 if msg. is_none ( ) { msg. replace ( s) ; }
142166 else { return Err ( FyiError :: InvalidCli ( kind) ) ; } ,
143167
144- Argument :: End ( _) => { } ,
145- _ => return Err ( FyiError :: InvalidCli ( kind) ) ,
168+ Argument :: OtherOs ( _) => return Err ( FyiError :: InvalidCli ( kind) ) ,
146169 }
147170 }
148171
0 commit comments