Skip to main content

update_version/
arguments.rs

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    /// Disable .gitignore and .uvignore file processing during file discovery
34    #[arg(long)]
35    pub no_ignore: bool,
36    /// Disable TLS certificate verification for git operations
37    #[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}