mod private
{
use crate ::{ run, run_project, RunOptions };
use crate ::program ::Plan;
use clap ::{ Parser, Subcommand };
use std ::path ::PathBuf;
#[ derive( Parser ) ]
#[ command( about = "Run Rust files and projects as scripts." ) ]
struct Cli
{
#[ command( subcommand ) ]
command : Commands,
}
#[ derive( Subcommand ) ]
enum Commands
{
Run( RunArgs ),
}
#[ derive( clap ::Args ) ]
struct RunArgs
{
target : PathBuf,
#[ arg( long, default_value = "" ) ]
profile : String,
#[ arg( long ) ]
target_dir : Option< String >,
#[ arg( long = "cargo", default_value = "" ) ]
cargo_bin : String,
#[ arg( long ) ]
timeout : Option< u64 >,
#[ arg( long = "feature" ) ]
features : Vec< String >,
#[ arg( long = "env" ) ]
env_vars : Vec< String >,
#[ arg( long, default_value = "" ) ]
edition : String,
#[ arg( long, default_value = "" ) ]
name : String,
#[ arg( long ) ]
capture : bool,
#[ arg( long ) ]
keep : bool,
}
pub fn run_cli()
{
let cli = Cli::parse();
let Commands::Run( args ) = cli.command;
let opts = RunOptions
{
build_profile : args.profile,
target_dir : args.target_dir,
cargo_path : args.cargo_bin,
timeout_ms : args.timeout,
features : args.features,
env_vars : args.env_vars,
edition : args.edition,
package_name : args.name,
capture : args.capture,
cleanup : !args.keep,
};
let result = if args.target.is_dir()
{
run_project( &args.target, &opts )
}
else
{
let code = match std ::fs ::read_to_string( &args.target )
{
Ok( s ) => s,
Err( e ) =>
{
eprintln!( "error: failed to read '{}': {e}", args.target.display() );
std ::process ::exit( 1 );
}
};
let plan = Plan ::former()
.program()
.source()
.file_path( "src/main.rs".to_string() )
.data( code )
.end()
.end()
.run_options( opts )
.form();
run( plan )
};
match result
{
Ok( output ) =>
{
if args.capture
{
print!( "{}", output.stdout_str() );
eprint!( "{}", output.stderr_str() );
}
std ::process ::exit( output.exit_status );
}
Err( e ) =>
{
eprintln!( "error: {e}" );
std ::process ::exit( 1 );
}
}
}
}
pub use private ::run_cli;