use semver::Version;
use serde::{Deserialize, Serialize};
#[macro_export]
macro_rules! version_info {
() => {
$crate::version::VersionInfo::from_pkg_version(::core::env!("CARGO_PKG_VERSION"))
};
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct VersionInfo {
pub version: Version,
#[serde(default)]
pub commit: Option<String>,
#[serde(default)]
pub date: Option<String>,
}
impl VersionInfo {
#[must_use]
pub const fn new(version: Version) -> Self {
Self { version, commit: None, date: None }
}
#[must_use]
pub fn with_commit(mut self, commit: impl Into<String>) -> Self {
self.commit = Some(commit.into());
self
}
#[must_use]
pub fn with_date(mut self, date: impl Into<String>) -> Self {
self.date = Some(date.into());
self
}
#[must_use]
pub fn from_pkg_version(raw: &str) -> Self {
let version = Version::parse(raw).unwrap_or_else(|_| Version::new(0, 0, 0));
Self::new(version)
}
#[must_use]
#[deprecated(
since = "0.9.0",
note = "returns rtb-app's version, not the calling tool's — `env!` expands where it is written. Use the `rtb_app::version_info!()` macro instead."
)]
pub fn from_env() -> Self {
Self::from_pkg_version(env!("CARGO_PKG_VERSION"))
}
#[must_use]
pub fn is_development(&self) -> bool {
self.version.major == 0 || !self.version.pre.is_empty()
}
}