diff --git a/src/main.rs b/src/main.rs index 8a1e718..221fb7c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -6,6 +6,7 @@ mod config; mod database; mod event; mod ui; +mod version; #[macro_use] mod log; diff --git a/src/version.rs b/src/version.rs new file mode 100644 index 0000000..e7fef73 --- /dev/null +++ b/src/version.rs @@ -0,0 +1,50 @@ +use std::{env, fmt}; + +#[derive(Default)] +pub struct Version { + major: u32, + minor: u32, + patch: u32, + pre: Option, +} + +impl Version { + /// read version at compile time from env variables + pub fn new() -> Self { + let mut res = Self::default(); + let major_str = env!("CARGO_PKG_VERSION_MAJOR"); + if let Ok(major) = major_str.parse::() { + res.major = major; + } + let minor_str = env!("CARGO_PKG_VERSION_MINOR"); + if let Ok(minor) = minor_str.parse::() { + res.minor = minor; + } + let patch_str = env!("CARGO_PKG_VERSION_PATCH"); + if let Ok(patch) = patch_str.parse::() { + res.patch = patch; + } + let pre_str = env!("CARGO_PKG_VERSION_PRE"); + res.pre = if pre_str.is_empty() { + None + } else { + Some(pre_str.to_string()) + }; + res + } +} + +impl fmt::Display for Version { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!( + f, + "v{}.{}.{}{}", + self.major, + self.minor, + self.patch, + self.pre + .as_ref() + .map_or(String::new(), |pre| format!("-{}", pre.to_string())) + ) + } +}