version_manager/
version.rs1use 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}