ya_compile_time_utils/
lib.rs

1pub use git_version::git_version;
2use metrics::gauge;
3use semver::Version;
4
5/// Returns latest commit short hash.
6pub fn git_rev() -> &'static str {
7    env!("VERGEN_SHA_SHORT")
8}
9
10/// Returns current date in YYYY-MM-DD format.
11pub fn build_date() -> &'static str {
12    env!("VERGEN_BUILD_DATE")
13}
14
15/// Returns Github Actions build string if available or None.
16pub fn build_number_str() -> Option<&'static str> {
17    option_env!("GITHUB_RUN_NUMBER")
18}
19
20/// Returns Github Actions build number if available or None.
21pub fn build_number() -> Option<i64> {
22    build_number_str().and_then(|s| s.parse().ok())
23}
24
25/// Converts a tag to semantic version
26pub fn tag2semver(tag: &str) -> &str {
27    let mut version = tag;
28    for prefix in ["pre-rel-", "v"].iter() {
29        if version.starts_with(prefix) {
30            version = &version[prefix.len()..];
31        }
32    }
33    version
34}
35
36pub fn report_version_to_metrics() {
37    if let Ok(version) = Version::parse(semver_str!()) {
38        gauge!("yagna.version.major", version.major as i64);
39        gauge!("yagna.version.minor", version.minor as i64);
40        gauge!("yagna.version.patch", version.patch as i64);
41        gauge!(
42            "yagna.version.is_prerelease",
43            (!version.pre.is_empty()) as i64
44        );
45        if let Some(build_number) = build_number() {
46            gauge!("yagna.version.build_number", build_number);
47        }
48    }
49}
50
51/// Returns latest version tag
52#[macro_export]
53macro_rules! git_tag {
54    () => {
55        $crate::git_version!(
56            args = [
57                "--tag",
58                "--abbrev=0",
59                "--match=v[0-9]*",
60                "--match=pre-rel-v[0-9]*"
61            ],
62            cargo_prefix = ""
63        )
64    };
65}
66
67/// Returns a semantic version string of the crate
68#[macro_export]
69macro_rules! semver_str {
70    () => {
71        $crate::tag2semver($crate::git_tag!())
72    };
73}
74
75#[macro_export]
76macro_rules! version_describe {
77    () => {
78        Box::leak(
79            [
80                $crate::semver_str!(),
81                " (",
82                $crate::git_rev(),
83                " ",
84                &$crate::build_date(),
85                &$crate::build_number_str()
86                    .map(|n| format!(" build #{}", n))
87                    .unwrap_or("".to_string()),
88                ")",
89            ]
90            .join("")
91            .into_boxed_str(),
92        ) as &str
93    };
94}
95
96#[cfg(test)]
97mod test {
98    use super::*;
99
100    #[test]
101    fn test_git_tag() {
102        println!("git tag: {:?}", git_tag!());
103    }
104
105    #[test]
106    fn test_git_rev() {
107        println!("git rev: {:?}", git_rev());
108    }
109
110    #[test]
111    fn test_semver() {
112        println!("semver: {:?}", Version::parse(semver_str!()));
113    }
114
115    #[test]
116    fn test_build_number() {
117        println!("build: {:?}", build_number());
118    }
119}