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