use derive_more::Display;
use serde::{Deserialize, Serialize};
use std::str::FromStr;
#[derive(
Debug, Clone, Copy, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize, Display,
)]
#[display("{major}.{minor}.{patch}")]
pub struct Version {
pub major: u64,
pub minor: u64,
pub patch: u64,
}
impl Version {
pub const fn new(major: u64, minor: u64, patch: u64) -> Self {
Self { major, minor, patch }
}
pub fn parse(s: &str) -> Result<Self, semver::Error> {
Ok(Self::from(semver::Version::parse(s)?))
}
}
impl From<semver::Version> for Version {
fn from(v: semver::Version) -> Self {
Self { major: v.major, minor: v.minor, patch: v.patch }
}
}
impl From<Version> for semver::Version {
fn from(v: Version) -> Self {
semver::Version::new(v.major, v.minor, v.patch)
}
}
impl FromStr for Version {
type Err = semver::Error;
fn from_str(s: &str) -> Result<Self, Self::Err> {
semver::Version::from_str(s).map(Into::into)
}
}
#[macro_export]
macro_rules! pkg_version {
() => {{
const fn parse(s: &str) -> u64 {
let b = s.as_bytes();
let mut r: u64 = 0;
let mut i = 0;
while i < b.len() {
r = r * 10 + (b[i] - b'0') as u64;
i += 1;
}
r
}
$crate::Version::new(
parse(env!("CARGO_PKG_VERSION_MAJOR")),
parse(env!("CARGO_PKG_VERSION_MINOR")),
parse(env!("CARGO_PKG_VERSION_PATCH")),
)
}};
}