version_manager/cli/
package.rs

1use super::{
2    files::FilesCommand,
3    getset::{GetSet, GetSetBuild, GetSetRm, SetVer},
4};
5use crate::{VersionError, version::Scope};
6use clap::{Parser, Subcommand};
7
8#[derive(Parser, Debug, Clone, PartialEq)]
9#[command(arg_required_else_help(true))]
10pub struct PackageCommand {
11    /// The package name to track
12    pub package_name: Option<String>,
13    #[clap(subcommand)]
14    pub command: PackageOperation,
15}
16
17impl TryFrom<PackageCommand> for Scope {
18    type Error = VersionError;
19
20    fn try_from(cmd: PackageCommand) -> Result<Self, Self::Error> {
21        Ok(Scope::Package(
22            (&cmd).try_into()?,
23            Box::new(cmd.command.try_into()?),
24        ))
25    }
26}
27
28impl TryFrom<&PackageCommand> for Scope {
29    type Error = VersionError;
30
31    fn try_from(cmd: &PackageCommand) -> Result<Self, Self::Error> {
32        Ok(Scope::Package(
33            cmd.try_into()?,
34            Box::new((&cmd.command).try_into()?),
35        ))
36    }
37}
38
39impl TryFrom<PackageCommand> for String {
40    type Error = VersionError;
41
42    fn try_from(cmd: PackageCommand) -> Result<Self, Self::Error> {
43        match cmd.package_name {
44            Some(ref name) => Ok(name.clone()),
45            None => {
46                if cmd.command == PackageOperation::List {
47                    Ok("".to_string())
48                } else {
49                    return Err(VersionError::PackageNameRequired);
50                }
51            }
52        }
53    }
54}
55
56impl TryFrom<&PackageCommand> for String {
57    type Error = VersionError;
58
59    fn try_from(cmd: &PackageCommand) -> Result<Self, Self::Error> {
60        match cmd.package_name {
61            Some(ref name) => Ok(name.clone()),
62            None => {
63                if cmd.command == PackageOperation::List {
64                    Ok("".to_string())
65                } else {
66                    return Err(VersionError::PackageNameRequired);
67                }
68            }
69        }
70    }
71}
72
73#[derive(Subcommand, Debug, Clone, PartialEq)]
74#[command(arg_required_else_help(true))]
75pub enum PackageOperation {
76    /// Change the major version number
77    Major(GetSet),
78    /// Change the minor version number
79    Minor(GetSet),
80    /// Change the patch version number
81    Patch(GetSet),
82    /// Change the alpha identifier
83    Alpha(GetSetRm),
84    /// Change the beta identifier
85    Beta(GetSetRm),
86    /// Change the release candidate identifier
87    RC(GetSetRm),
88    /// Change the build identifier
89    Build(GetSetBuild),
90    /// Get the current version number as a full SemVer string
91    Get,
92    /// Set the version number to a specific version
93    Set(SetVer),
94    /// Get just the version number as a string with no revision or build identifiers
95    Version,
96    /// Get just the revision number as a string with no build identifiers
97    Revision,
98    /// Track and update the version number in a file
99    File(FilesCommand),
100    /// Remove a package
101    Rm,
102    /// List tracked packages
103    List,
104}
105
106impl TryFrom<PackageOperation> for Scope {
107    type Error = VersionError;
108
109    fn try_from(cmd: PackageOperation) -> Result<Self, Self::Error> {
110        let scope = match cmd {
111            PackageOperation::Major(getset) => Scope::Major(getset.try_into()?),
112            PackageOperation::Minor(getset) => Scope::Minor(getset.try_into()?),
113            PackageOperation::Patch(getset) => Scope::Patch(getset.try_into()?),
114            PackageOperation::Alpha(getset) => Scope::Alpha(getset.try_into()?),
115            PackageOperation::Beta(getset) => Scope::Beta(getset.try_into()?),
116            PackageOperation::RC(getset) => Scope::RC(getset.try_into()?),
117            PackageOperation::Build(getset) => Scope::Build(getset.try_into()?),
118            PackageOperation::Get => Scope::Get,
119            PackageOperation::Version => Scope::Version,
120            PackageOperation::Revision => Scope::Revision,
121            PackageOperation::File(file_cmd) => Scope::File(file_cmd.try_into()?),
122            PackageOperation::Rm => Scope::RmPackage,
123            PackageOperation::List => Scope::ListPackages,
124            PackageOperation::Set(setver) => Scope::Set(setver.try_into()?),
125        };
126        Ok(scope)
127    }
128}
129
130impl TryFrom<&PackageOperation> for Scope {
131    type Error = VersionError;
132
133    fn try_from(cmd: &PackageOperation) -> Result<Self, Self::Error> {
134        let scope = match cmd {
135            PackageOperation::Major(getset) => Scope::Major(getset.try_into()?),
136            PackageOperation::Minor(getset) => Scope::Minor(getset.try_into()?),
137            PackageOperation::Patch(getset) => Scope::Patch(getset.try_into()?),
138            PackageOperation::Alpha(getset) => Scope::Alpha(getset.try_into()?),
139            PackageOperation::Beta(getset) => Scope::Beta(getset.try_into()?),
140            PackageOperation::RC(getset) => Scope::RC(getset.try_into()?),
141            PackageOperation::Build(getset) => Scope::Build(getset.try_into()?),
142            PackageOperation::Get => Scope::Get,
143            PackageOperation::Version => Scope::Version,
144            PackageOperation::Revision => Scope::Revision,
145            PackageOperation::File(file_cmd) => Scope::File(file_cmd.try_into()?),
146            PackageOperation::Rm => Scope::RmPackage,
147            PackageOperation::List => Scope::ListPackages,
148            PackageOperation::Set(setver) => Scope::Set(setver.try_into()?),
149        };
150        Ok(scope)
151    }
152}