use signaling::v2::{RoomId, is_room_uuid};
pub fn room_id_to_bytes(room_id: &RoomId) -> Vec<u8> {
room_id.as_bytes().to_vec()
}
pub fn room_id_from_bytes(bytes: &[u8]) -> Option<RoomId> {
let bytes: [u8; 16] = bytes.try_into().ok()?;
let room_id = RoomId::from_bytes(bytes);
is_room_uuid(&room_id).then_some(room_id)
}
#[cfg(test)]
mod tests {
use super::*;
use signaling::v2::new_room_id;
#[test]
fn room_ids_round_trip_through_the_wire_form() {
let room_id = new_room_id();
assert_eq!(
room_id_from_bytes(&room_id_to_bytes(&room_id)),
Some(room_id)
);
}
#[test]
fn wire_form_rejects_wrong_length_and_non_v8_uuids() {
let room_id = new_room_id();
let bytes = room_id_to_bytes(&room_id);
assert_eq!(room_id_from_bytes(&[]), None);
assert_eq!(room_id_from_bytes(&bytes[..15]), None);
assert_eq!(room_id_from_bytes(&[bytes.clone(), vec![0]].concat()), None);
assert_eq!(room_id_from_bytes(uuid::Uuid::new_v4().as_bytes()), None);
}
}