version_manager/
version.rs

1use crate::VersionError;
2use crate::files::TrackedFiles;
3use semver::Prerelease;
4
5#[derive(Debug, Clone, PartialEq)]
6pub enum Operator {
7    Set(SetTypes),
8    Rm,
9    Reset,
10    Get,
11    AddFile(SetTypes),
12    SetVersion(String),
13    Update(String),
14    RmFile(String),
15    UpdateAll,
16    ListFiles,
17    None,
18}
19
20#[derive(Debug, Clone, PartialEq)]
21pub enum SetTypes {
22    AddNumber,
23    SubNumber,
24    Number(u64),
25    String(String),
26    NewFile(TrackedFiles),
27}
28
29#[derive(Debug, Clone, PartialEq)]
30pub enum Scope {
31    Major(Operator),
32    Minor(Operator),
33    Patch(Operator),
34    Alpha(Operator),
35    Beta(Operator),
36    Pre(Operator),
37    RC(Operator),
38    Build(Operator),
39    Get,
40    Set(Operator),
41    Version,
42    Revision,
43    File(Operator),
44    Package(String, Box<Scope>),
45    ListPackages,
46    RmPackage,
47}
48
49pub struct PrereleaseWrapper {
50    pub pre: String,
51    pub num: u64,
52}
53
54impl PrereleaseWrapper {
55    pub fn new(pre: String, num: u64) -> Self {
56        Self { pre, num }
57    }
58}
59
60impl TryFrom<PrereleaseWrapper> for Prerelease {
61    type Error = semver::Error;
62
63    fn try_from(wrapper: PrereleaseWrapper) -> Result<Self, Self::Error> {
64        Prerelease::new(&format!("{}.{}", wrapper.pre, wrapper.num))
65    }
66}
67
68impl TryFrom<Prerelease> for PrereleaseWrapper {
69    type Error = VersionError;
70
71    fn try_from(prerelease: Prerelease) -> Result<Self, Self::Error> {
72        let parts: Vec<&str> = prerelease.as_str().split('.').collect();
73        if parts.len() != 2 {
74            Err(VersionError::InvalidPrerelease(prerelease.to_string()))
75        } else {
76            let pre = parts[0].to_string();
77            let num = parts[1]
78                .parse::<u64>()
79                .map_err(|_| VersionError::InvalidPrerelease(prerelease.to_string()))?;
80            Ok(PrereleaseWrapper::new(pre, num))
81        }
82    }
83}
84
85impl ToString for PrereleaseWrapper {
86    fn to_string(&self) -> String {
87        format!("{}.{}", self.pre, self.num)
88    }
89}