use serde::{Deserialize, Serialize};
use crate::hashing::sha256_hex;
fn derive_raw(prefix: &str, session_id: &str, discriminator: &str) -> String {
let digest = sha256_hex(format!("{prefix}\u{1f}{session_id}\u{1f}{discriminator}"));
format!("{prefix}{}", &digest[..12])
}
macro_rules! graph_id {
($(#[$meta:meta])* $name:ident, $prefix:literal) => {
$(#[$meta])*
#[derive(
Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize,
)]
#[serde(transparent)]
pub struct $name(String);
impl $name {
pub const PREFIX: &'static str = $prefix;
#[must_use]
pub fn derive(session_id: &str, discriminator: &str) -> Self {
Self(derive_raw($prefix, session_id, discriminator))
}
#[must_use]
pub fn as_str(&self) -> &str {
&self.0
}
}
impl std::fmt::Display for $name {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(&self.0)
}
}
};
}
graph_id!(
WorkNodeId,
"wn:"
);
graph_id!(
WorkEdgeId,
"we:"
);
graph_id!(
ChangeId,
"ch:"
);
graph_id!(
ProposalId,
"pp:"
);
graph_id!(
BindingId,
"bd:"
);