lex_lib/
semantic_versioning.rs1#[derive(Debug, Clone, PartialEq, Eq)]
4pub struct SemVer {
5 pub major: i32,
7 pub minor: i32,
9 pub patch: i32,
11 pub extra_field: String }
14
15impl SemVer {
16 pub fn new(major: i32, minor: i32, patch: i32, extra_field: String) -> Self {
20 Self {
21 major,
22 minor,
23 patch,
24 extra_field,
25 }
26 }
27
28 pub fn from_string(string: String) -> Result<Self, &'static str> {
30 let string: Vec<&str> = string.split('-').collect();
31 let ver: Vec<&str> = string[0].split('.').collect();
32 if ver.len() != 3 || string.len() > 2 {
33 return Err("invalid version length")
34 }
35 Ok(Self{
36 major: match ver[0].parse() {
37 Ok(v) => v,
38 Err(..) => return Err("invalid major")
39 },
40 minor: match ver[1].parse() {
41 Ok(v) => v,
42 Err(..) => return Err("invalid minor")
43 },
44 patch: match ver[2].parse() {
45 Ok(v) => v,
46 Err(..) => return Err("invalid patch")
47 },
48 extra_field: if string.len() > 1 {
49 string[1].to_owned()
50 } else {
51 "".to_owned()
52 }
53 })
54 }
55
56 pub fn to_string(&self) -> String {
58 let tmp = [
59 &self.major.to_string(), ".",
60 &self.minor.to_string(), ".",
61 &self.patch.to_string()
62 ].concat();
63 if !self.extra_field.is_empty() {
64 return [
65 &tmp, "-",
66 &self.extra_field
67 ].concat();
68 }
69 tmp
70 }
71
72 pub fn difference(&self, other: &Self) -> Self {
74 Self{
75 major: self.major - other.major,
76 minor: self.minor - other.minor,
77 patch: self.patch - other.patch,
78 extra_field: "".to_owned()
79 }
80 }
81}
82
83impl Default for SemVer {
84 fn default() -> Self {
86 Self {
87 major: 0,
88 minor: 1,
89 patch: 0,
90 extra_field: "".to_owned()
91 }
92 }
93}