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