11use std:: {
2+ env,
23 io:: { self , stderr} ,
34 path:: { Path , PathBuf } ,
45} ;
56
6- use clap :: { ArgGroup , Parser } ;
7+ use anyhow :: bail ;
78
89use rust_java:: { StartType , run} ;
910
10- #[ derive( Parser ) ]
11- #[ clap( group = ArgGroup :: new( "target" ) . required( true ) . multiple( false ) ) ]
1211struct Opts {
13- #[ arg( group = "target" , name = "mainclass" ) ]
14- main_class : Option < PathBuf > ,
15- #[ arg( long, group = "target" , name = "jarfile" ) ]
1612 jar : Option < PathBuf > ,
17-
13+ main_class : Option < PathBuf > ,
1814 args : Vec < String > ,
1915}
2016
@@ -33,7 +29,7 @@ pub fn main() -> anyhow::Result<()> {
3329}
3430
3531pub async fn async_main ( ) -> anyhow:: Result < ( ) > {
36- let opts = Opts :: parse ( ) ;
32+ let opts = parse_args ( ) ? ;
3733
3834 let start_type = if opts. main_class . is_some ( ) {
3935 StartType :: Class ( opts. main_class . as_ref ( ) . unwrap ( ) )
@@ -45,3 +41,34 @@ pub async fn async_main() -> anyhow::Result<()> {
4541
4642 Ok ( ( ) )
4743}
44+
45+ fn parse_args ( ) -> anyhow:: Result < Opts > {
46+ let mut args = env:: args ( ) . skip ( 1 ) ; // skip program name
47+ let mut jar = None ;
48+ let mut main_class = None ;
49+ let mut rest_args = Vec :: new ( ) ;
50+
51+ if let Some ( first) = args. next ( ) {
52+ if first == "-jar" {
53+ // java -jar foo.jar [args...]
54+ if let Some ( jar_path) = args. next ( ) {
55+ jar = Some ( jar_path. into ( ) ) ;
56+ rest_args. extend ( args) ;
57+ } else {
58+ bail ! ( "Missing jar file after -jar" ) ;
59+ }
60+ } else {
61+ // java MainClass [args...]
62+ main_class = Some ( first. into ( ) ) ;
63+ rest_args. extend ( args) ;
64+ }
65+ } else {
66+ bail ! ( "No class or -jar specified" ) ;
67+ }
68+
69+ Ok ( Opts {
70+ jar,
71+ main_class,
72+ args : rest_args,
73+ } )
74+ }
0 commit comments