-
Notifications
You must be signed in to change notification settings - Fork 99
/
Copy pathargs.rs
132 lines (114 loc) · 4.31 KB
/
args.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
// Copyright 2019-2022 Tauri Programme within The Commons Conservancy
// SPDX-License-Identifier: Apache-2.0
// SPDX-License-Identifier: MIT
use std::{ffi::OsString, fmt::Display, str::FromStr};
use pico_args::Arguments;
use crate::{package_manager::PackageManager, template::Template, utils::colors::*};
#[derive(Debug, Copy, Clone, Default, PartialEq, Eq)]
pub enum TauriVersion {
V1,
#[default]
V2,
}
impl TauriVersion {
pub fn all() -> [TauriVersion; 2] {
[TauriVersion::V1, TauriVersion::V2]
}
}
impl Display for TauriVersion {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::V1 => write!(f, "1"),
Self::V2 => write!(f, "2"),
}
}
}
impl FromStr for TauriVersion {
type Err = &'static str;
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s {
"1" => Ok(Self::V1),
"2" => Ok(Self::V2),
_ => Err("unknown Tauri version"),
}
}
}
#[derive(Debug)]
pub struct Args {
pub project_name: Option<String>,
pub manager: Option<PackageManager>,
pub template: Option<Template>,
pub identifier: Option<String>,
pub skip: bool,
pub force: bool,
pub tauri_version: TauriVersion,
}
impl Default for Args {
fn default() -> Self {
Self {
project_name: Some("tauri-app".to_string()),
identifier: Some("com.tauri.dev".to_string()),
manager: Some(PackageManager::Npm),
template: Some(Template::Vanilla),
skip: false,
force: false,
tauri_version: TauriVersion::default(),
}
}
}
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 [{templates}]
{GREEN}--identifier <identifier>{RESET} Specify a unique identifier for your application
{GREEN}-y{RESET}, {GREEN}--yes{RESET} Skip prompts and use defaults where applicable
{GREEN}-f{RESET}, {GREEN}--force{RESET} Force create the directory even if it is not empty.
{GREEN}--tauri-version [1 | 2]{RESET} Bootstrap a project using the provided Tauri version. Defaults to the latest stable release.
{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(", "),
templates = 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 tauri_version: Option<TauriVersion> = pargs.opt_value_from_str("--tauri-version")?;
let args = Args {
manager: pargs.opt_value_from_str(["-m", "--manager"])?,
template: pargs.opt_value_from_str(["-t", "--template"])?,
skip: pargs.contains(["-y", "--yes"]),
force: pargs.contains(["-f", "--force"]),
tauri_version: tauri_version.unwrap_or_default(),
identifier: pargs.opt_value_from_str("--identifier")?,
project_name: pargs.opt_free_from_str()?,
};
Ok(args)
}