#[cfg(feature = "serde")]
use std::sync::atomic::{AtomicU64, Ordering};
mod checksum;
mod eic_code;
mod malo_id;
mod marktpartner_id;
mod melo_id;
mod nelo_id;
mod obis_code;
#[cfg(test)]
mod proptest_impls;
#[cfg(feature = "sqlx")]
mod sqlx_impls;
mod sr_id;
mod tr_id;
pub use eic_code::{EicCode, EicDomain};
pub use malo_id::MaloId;
pub use marktpartner_id::MarktpartnerId;
pub use melo_id::MeloId;
pub use nelo_id::NeloId;
pub use obis_code::{ObisCode, ObisComponents};
pub use sr_id::SrId;
pub use tr_id::TrId;
#[cfg(feature = "serde")]
#[cfg_attr(docsrs, doc(cfg(feature = "serde")))]
pub use marktpartner_id::serde_as_i64 as marktpartner_id_as_i64;
#[cfg(feature = "serde")]
static IDENTIFIER_DESER_FAILURES: AtomicU64 = AtomicU64::new(0);
#[cfg(feature = "serde")]
#[cfg_attr(docsrs, doc(cfg(feature = "serde")))]
#[must_use]
pub fn identifier_deser_failure_count() -> u64 {
IDENTIFIER_DESER_FAILURES.load(Ordering::Relaxed)
}
#[cfg(feature = "serde")]
pub(crate) fn trace_identifier_deser_error(
identifier: &'static str,
input: &str,
error: &crate::error::IdentifierError,
) {
IDENTIFIER_DESER_FAILURES.fetch_add(1, Ordering::Relaxed);
#[cfg(feature = "metrics")]
metrics::counter!(
"bo4e_identifier_deser_failure_total",
"identifier" => identifier,
)
.increment(1);
#[cfg(feature = "tracing")]
tracing::warn!(
identifier,
input,
error = %error,
"identifier validation failed during deserialization"
);
#[cfg(not(feature = "tracing"))]
{
let _ = (identifier, input, error);
}
}