pkg_details/
lib.rs

1use std::sync::{LazyLock, RwLock};
2
3pub static __PKG_DETAILS: LazyLock<RwLock<Option<PkgDetails>>> = LazyLock::new(|| RwLock::new(None));
4
5#[derive(Debug, Clone)]
6pub struct PkgDetails {
7    pub pkg_name: &'static str,
8    pub pkg_version: &'static str,
9}
10
11#[macro_export]
12macro_rules! init {
13    () => {{
14        let d = $crate::PkgDetails {
15            pkg_name: env!("CARGO_PKG_NAME"),
16            pkg_version: env!("CARGO_PKG_VERSION"),
17        };
18        let mut lock = $crate::__PKG_DETAILS.write().unwrap();
19        lock.replace(d);
20    }};
21}
22
23pub fn try_get() -> Option<PkgDetails> {
24    __PKG_DETAILS.read().ok()?.clone()
25}
26
27pub fn get() -> PkgDetails {
28    __PKG_DETAILS
29        .read().expect("had a panic writing to lock")
30        .clone().expect("call to pkg_details::init!() required")
31}
32