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 env = $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();
19        lock.replace(env);
20        logging
21    }};
22}
23
24pub fn try_get() -> Option<PkgDetails> {
25    __PKG_DETAILS.read().ok()?.clone()
26}
27
28pub fn get() -> PkgDetails {
29    __PKG_DETAILS
30        .read().expect("had a panic writing to lock")
31        .clone().expect("call to pkg_details::init!() required")
32}
33