use bytes::BufMut;
use crate::snowflake_id::{SnowflakeId32, SnowflakeId64};
use crate::types::{Ulid, Uuid, UuidCompact};
impl Uuid {
#[inline]
pub fn put_to_be<B: BufMut>(&self, buf: &mut B) {
let (hi, lo) = self.to_raw();
buf.put_u64(hi);
buf.put_u64(lo);
}
#[inline]
pub fn put_to_le<B: BufMut>(&self, buf: &mut B) {
let (hi, lo) = self.to_raw();
buf.put_u64_le(lo);
buf.put_u64_le(hi);
}
}
impl UuidCompact {
#[inline]
pub fn put_to_be<B: BufMut>(&self, buf: &mut B) {
let (hi, lo) = self.to_raw();
buf.put_u64(hi);
buf.put_u64(lo);
}
#[inline]
pub fn put_to_le<B: BufMut>(&self, buf: &mut B) {
let (hi, lo) = self.to_raw();
buf.put_u64_le(lo);
buf.put_u64_le(hi);
}
}
impl Ulid {
#[inline]
pub fn put_to_be<B: BufMut>(&self, buf: &mut B) {
let ts = self.timestamp_millis();
let (rand_hi, rand_lo) = self.random();
let ts_bytes = ts.to_be_bytes();
buf.put_slice(&ts_bytes[2..8]);
buf.put_u16(rand_hi);
buf.put_u64(rand_lo);
}
#[inline]
pub fn put_to_le<B: BufMut>(&self, buf: &mut B) {
let ts = self.timestamp_millis();
let (rand_hi, rand_lo) = self.random();
buf.put_u64_le(rand_lo);
buf.put_u16_le(rand_hi);
let ts_bytes = ts.to_le_bytes();
buf.put_slice(&ts_bytes[0..6]);
}
}
impl<const TS: u8, const WK: u8, const SQ: u8> SnowflakeId64<TS, WK, SQ> {
#[inline]
pub fn put_to_be<B: BufMut>(&self, buf: &mut B) {
buf.put_u64(self.0);
}
#[inline]
pub fn put_to_le<B: BufMut>(&self, buf: &mut B) {
buf.put_u64_le(self.0);
}
}
impl<const TS: u8, const WK: u8, const SQ: u8> SnowflakeId32<TS, WK, SQ> {
#[inline]
pub fn put_to_be<B: BufMut>(&self, buf: &mut B) {
buf.put_u32(self.0);
}
#[inline]
pub fn put_to_le<B: BufMut>(&self, buf: &mut B) {
buf.put_u32_le(self.0);
}
}
#[cfg(test)]
mod tests {
use super::*;
use bytes::BytesMut;
#[test]
fn uuid_put_to_matches_to_bytes() {
let uuid = Uuid::from_raw(0x0123_4567_89AB_CDEF, 0xFEDC_BA98_7654_3210);
let mut be = BytesMut::with_capacity(16);
uuid.put_to_be(&mut be);
assert_eq!(&be[..], &uuid.to_be_bytes());
let mut le = BytesMut::with_capacity(16);
uuid.put_to_le(&mut le);
assert_eq!(&le[..], &uuid.to_le_bytes());
}
#[test]
fn uuid_compact_put_to_matches_to_bytes() {
let uuid = UuidCompact::from_raw(0xDEAD_BEEF_CAFE_BABE, 0x0123_4567_89AB_CDEF);
let mut be = BytesMut::with_capacity(16);
uuid.put_to_be(&mut be);
assert_eq!(&be[..], &uuid.to_be_bytes());
let mut le = BytesMut::with_capacity(16);
uuid.put_to_le(&mut le);
assert_eq!(&le[..], &uuid.to_le_bytes());
}
#[test]
fn ulid_put_to_matches_to_bytes() {
let ulid = Ulid::from_raw(1_700_000_000_000, 0x1234, 0xDEAD_BEEF_CAFE_BABE);
let mut be = BytesMut::with_capacity(16);
ulid.put_to_be(&mut be);
assert_eq!(&be[..], &ulid.to_be_bytes());
let mut le = BytesMut::with_capacity(16);
ulid.put_to_le(&mut le);
assert_eq!(&le[..], &ulid.to_le_bytes());
}
#[test]
fn snowflake64_put_to() {
let id = SnowflakeId64::<42, 6, 16>::from_raw(0xDEAD_BEEF_CAFE_BABE);
let mut be = BytesMut::with_capacity(8);
id.put_to_be(&mut be);
assert_eq!(&be[..], &0xDEAD_BEEF_CAFE_BABEu64.to_be_bytes());
let mut le = BytesMut::with_capacity(8);
id.put_to_le(&mut le);
assert_eq!(&le[..], &0xDEAD_BEEF_CAFE_BABEu64.to_le_bytes());
}
#[test]
fn snowflake32_put_to() {
let id = SnowflakeId32::<20, 4, 8>::from_raw(0xDEAD_BEEF);
let mut be = BytesMut::with_capacity(4);
id.put_to_be(&mut be);
assert_eq!(&be[..], &0xDEAD_BEEFu32.to_be_bytes());
let mut le = BytesMut::with_capacity(4);
id.put_to_le(&mut le);
assert_eq!(&le[..], &0xDEAD_BEEFu32.to_le_bytes());
}
}