lex_lib/
semantic_versioning.rs

1//! Semantic Version.
2
3#[derive(Debug, Clone, PartialEq, Eq)]
4pub struct SemVer {
5	/// Major
6	pub major: i32,
7	/// Minor
8	pub minor: i32,
9	/// Patch
10	pub patch: i32,
11	/// extra_field is the anotation like `-alpha`
12	pub extra_field: String // TODO this needs a better name
13}
14
15impl SemVer {
16	/// Creates a new [`SemVer`] with initialized values.
17	///
18	/// Use `dafault()` for a 0.1.0 initialized.
19	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	/// Creates a new [`SemVer`] from a [`String`] like `1.12.2-alpha`
29	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	/// Converts itself into a [`String`] like `89.4.6-beta`
57	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	/// Returns the difference as a [`SemVer`] of itself agains other [`SemVer`].
73	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	/// Creates a new [`SemVer`] initialized with `0.1.0`
85	fn default() -> Self {
86		Self {
87			major: 0,
88			minor: 1,
89			patch: 0,
90			extra_field: "".to_owned()
91		}
92	}
93}