1use clap::{Parser, ValueEnum};
2
3#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, ValueEnum, Default)]
4pub enum SupportedTypes {
5 #[default]
6 All,
7 TOML,
8 PackageJSON,
9 TauriConfig,
10}
11
12#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, ValueEnum, Default)]
13pub enum GitMode {
14 #[default]
15 None,
16 Commit,
17 CommitPush,
18 CommitPushTag,
19 CommitTag,
20}
21
22#[derive(Debug, Parser)]
23#[command(author, version, about, bin_name = "uv")]
24pub struct Arguments {
25 #[arg(long="types", short='t', value_enum, ignore_case = true, default_value_t = SupportedTypes::All)]
26 pub supported_types: SupportedTypes,
27 #[arg(long, short, value_enum, ignore_case = true, default_value_t = GitMode::None)]
28 pub git_mode: GitMode,
29 #[arg(long, short, default_value = "./")]
30 pub path: String,
31 #[arg(long, short)]
32 pub verbose: bool,
33 #[arg(long)]
35 pub no_ignore: bool,
36 #[arg(long)]
38 pub allow_insecure: bool,
39 pub new_version: Option<String>,
40}
41
42#[cfg(test)]
43mod tests {
44 use super::*;
45
46 #[test]
47 fn test_default_values() {
48 let args = Arguments::parse_from(["uv"]);
49 assert_eq!(args.supported_types, SupportedTypes::All);
50 assert_eq!(args.git_mode, GitMode::None);
51 assert_eq!(args.path, "./");
52 assert!(!args.verbose);
53 assert!(!args.allow_insecure);
54 assert!(args.new_version.is_none());
55 }
56
57 #[test]
58 fn test_parse_version() {
59 let args = Arguments::parse_from(["uv", "1.2.3"]);
60 assert_eq!(args.new_version, Some("1.2.3".to_string()));
61 }
62
63 #[test]
64 fn test_parse_types_toml() {
65 let args = Arguments::parse_from(["uv", "-t", "toml"]);
66 assert_eq!(args.supported_types, SupportedTypes::TOML);
67 }
68
69 #[test]
70 fn test_parse_types_case_insensitive() {
71 let args = Arguments::parse_from(["uv", "-t", "TOML"]);
72 assert_eq!(args.supported_types, SupportedTypes::TOML);
73
74 let args = Arguments::parse_from(["uv", "-t", "PACKAGE-JSON"]);
75 assert_eq!(args.supported_types, SupportedTypes::PackageJSON);
76
77 let args = Arguments::parse_from(["uv", "-t", "tauri-config"]);
78 assert_eq!(args.supported_types, SupportedTypes::TauriConfig);
79 }
80
81 #[test]
82 fn test_parse_git_mode_commit() {
83 let args = Arguments::parse_from(["uv", "-g", "commit"]);
84 assert_eq!(args.git_mode, GitMode::Commit);
85 }
86
87 #[test]
88 fn test_parse_git_mode_commit_push() {
89 let args = Arguments::parse_from(["uv", "-g", "commit-push"]);
90 assert_eq!(args.git_mode, GitMode::CommitPush);
91 }
92
93 #[test]
94 fn test_parse_git_mode_commit_push_tag() {
95 let args = Arguments::parse_from(["uv", "-g", "commit-push-tag"]);
96 assert_eq!(args.git_mode, GitMode::CommitPushTag);
97 }
98
99 #[test]
100 fn test_parse_git_mode_commit_tag() {
101 let args = Arguments::parse_from(["uv", "-g", "commit-tag"]);
102 assert_eq!(args.git_mode, GitMode::CommitTag);
103 }
104
105 #[test]
106 fn test_parse_path() {
107 let args = Arguments::parse_from(["uv", "-p", "/some/path"]);
108 assert_eq!(args.path, "/some/path");
109 }
110
111 #[test]
112 fn test_parse_verbose() {
113 let args = Arguments::parse_from(["uv", "-v"]);
114 assert!(args.verbose);
115 }
116
117 #[test]
118 fn test_parse_long_flags() {
119 let args = Arguments::parse_from([
120 "uv",
121 "--types",
122 "toml",
123 "--git-mode",
124 "commit",
125 "--path",
126 "/test",
127 "--verbose",
128 "2.0.0",
129 ]);
130 assert_eq!(args.supported_types, SupportedTypes::TOML);
131 assert_eq!(args.git_mode, GitMode::Commit);
132 assert_eq!(args.path, "/test");
133 assert!(args.verbose);
134 assert_eq!(args.new_version, Some("2.0.0".to_string()));
135 }
136
137 #[test]
138 fn test_parse_combined_short_flags() {
139 let args = Arguments::parse_from(["uv", "-t", "toml", "-g", "commit-push-tag", "1.0.0"]);
140 assert_eq!(args.supported_types, SupportedTypes::TOML);
141 assert_eq!(args.git_mode, GitMode::CommitPushTag);
142 assert_eq!(args.new_version, Some("1.0.0".to_string()));
143 }
144
145 #[test]
146 fn test_git_mode_equality() {
147 assert_eq!(GitMode::None, GitMode::None);
148 assert_ne!(GitMode::None, GitMode::Commit);
149 assert_ne!(GitMode::Commit, GitMode::CommitPush);
150 }
151
152 #[test]
153 fn test_supported_types_equality() {
154 assert_eq!(SupportedTypes::All, SupportedTypes::All);
155 assert_ne!(SupportedTypes::All, SupportedTypes::TOML);
156 }
157}