94 lines
3.1 KiB
Rust
94 lines
3.1 KiB
Rust
|
use std::ffi::OsString;
|
||
|
|
||
|
use pico_args::Arguments;
|
||
|
|
||
|
use crate::{colors::*, package_manager::PackageManager, template::Template};
|
||
|
|
||
|
#[derive(Debug)]
|
||
|
pub struct Args {
|
||
|
pub project_name: Option<String>,
|
||
|
pub manager: Option<PackageManager>,
|
||
|
pub template: Option<Template>,
|
||
|
pub skip: bool,
|
||
|
pub alpha: bool,
|
||
|
pub mobile: Option<bool>,
|
||
|
}
|
||
|
|
||
|
impl Default for Args {
|
||
|
fn default() -> Self {
|
||
|
Self {
|
||
|
project_name: Some("makepad-app".to_string()),
|
||
|
manager: Some(PackageManager::Cargo),
|
||
|
template: Some(Template::MakepadCounter),
|
||
|
skip: false,
|
||
|
alpha: false,
|
||
|
mobile: Some(false),
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
pub fn parse(argv: Vec<OsString>, bin_name: Option<String>) -> anyhow::Result<Args> {
|
||
|
let mut pargs = Arguments::from_vec(argv);
|
||
|
|
||
|
if pargs.contains(["-h", "--help"]) {
|
||
|
let help = format!(
|
||
|
r#"
|
||
|
{GREEN}{name}{RESET} {version}
|
||
|
{authors}
|
||
|
{desc}
|
||
|
|
||
|
{YELLOW}USAGE:{RESET}
|
||
|
{name} [OPTIONS] [PROJECTNAME]
|
||
|
|
||
|
{YELLOW}ARGS:{RESET}
|
||
|
{GREEN}<PROJECTNAME>{RESET} Specify project name which is used for the directory, package.json and Cargo.toml
|
||
|
|
||
|
{YELLOW}OPTIONS:{RESET}
|
||
|
{GREEN}-m{RESET}, {GREEN}--manager <MANAGER>{RESET} Specify preferred package manager [{managers}]
|
||
|
{GREEN}-t{RESET}, {GREEN}--template <TEMPLATE>{RESET} Specify the UI template to use [{fragments}]
|
||
|
{GREEN}-y{RESET}, {GREEN}--yes{RESET} Skip prompts and use defaults where applicable
|
||
|
{GREEN}--alpha{RESET} Bootstraps a project using tauri@2.0-alpha
|
||
|
{GREEN}--mobile{RESET} Bootstraps a mobile project too. Only availabe with `--alpha` option.
|
||
|
{GREEN}-h{RESET}, {GREEN}--help{RESET} Prints help information
|
||
|
{GREEN}-v{RESET}, {GREEN}--version{RESET} Prints version information
|
||
|
"#,
|
||
|
name = bin_name.unwrap_or_else(|| env!("CARGO_PKG_NAME").to_string()),
|
||
|
version = env!("CARGO_PKG_VERSION"),
|
||
|
authors = env!("CARGO_PKG_AUTHORS"),
|
||
|
desc = env!("CARGO_PKG_DESCRIPTION"),
|
||
|
managers = PackageManager::ALL
|
||
|
.iter()
|
||
|
.map(|e| format!("{GREEN}{e}{RESET}"))
|
||
|
.collect::<Vec<_>>()
|
||
|
.join(", "),
|
||
|
fragments = Template::ALL
|
||
|
.iter()
|
||
|
.map(|e| format!("{GREEN}{e}{RESET}"))
|
||
|
.collect::<Vec<_>>()
|
||
|
.join(", "),
|
||
|
);
|
||
|
|
||
|
println!("{help}");
|
||
|
std::process::exit(0);
|
||
|
}
|
||
|
if pargs.contains(["-v", "--version"]) {
|
||
|
println!("{}", env!("CARGO_PKG_VERSION"));
|
||
|
std::process::exit(0);
|
||
|
}
|
||
|
|
||
|
let args = Args {
|
||
|
manager: pargs.opt_value_from_str(["-m", "--manager"])?,
|
||
|
template: pargs.opt_value_from_str(["-t", "--template"])?,
|
||
|
skip: pargs.contains(["-y", "--yes"]),
|
||
|
alpha: pargs.contains("--alpha"),
|
||
|
mobile: if pargs.contains("--mobile") {
|
||
|
Some(true)
|
||
|
} else {
|
||
|
None
|
||
|
},
|
||
|
project_name: pargs.opt_free_from_str()?,
|
||
|
};
|
||
|
|
||
|
Ok(args)
|
||
|
}
|