use rand::Rng;
use secrecy::ExposeSecret;
use serde::{Serialize, Serializer};
pub type StreamId = ubid::Ubid160;
pub type TokenId = ubid::Ubid120;
pub type BearerToken = secrecy::SecretString;
#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
pub struct WriterId([u8; 16]);
impl WriterId {
pub const BYTE_LEN: usize = 16;
pub fn new_random() -> Self {
let mut bytes = [0_u8; Self::BYTE_LEN];
fill_random(&mut bytes);
Self(bytes)
}
pub const fn from_bytes(bytes: [u8; Self::BYTE_LEN]) -> Self {
Self(bytes)
}
pub const fn as_bytes(&self) -> &[u8; Self::BYTE_LEN] {
&self.0
}
}
fn fill_random(bytes: &mut [u8]) {
rand::rng().fill_bytes(bytes);
}
impl Serialize for WriterId {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
serializer.serialize_bytes(self.as_bytes())
}
}
pub(crate) fn serialize_bearer_token<S>(
token: &BearerToken,
serializer: S,
) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
serializer.serialize_str(token.expose_secret())
}