diff --git a/crates/ruma-identifiers/src/room_or_room_alias_id.rs b/crates/ruma-identifiers/src/room_or_room_alias_id.rs index d9f1d026..34148444 100644 --- a/crates/ruma-identifiers/src/room_or_room_alias_id.rs +++ b/crates/ruma-identifiers/src/room_or_room_alias_id.rs @@ -84,6 +84,18 @@ enum Variant { RoomAliasId, } +impl<'a> From<&'a RoomId> for &'a RoomOrAliasId { + fn from(room_id: &'a RoomId) -> Self { + RoomOrAliasId::from_borrowed(room_id.as_str()) + } +} + +impl<'a> From<&'a RoomAliasId> for &'a RoomOrAliasId { + fn from(room_alias_id: &'a RoomAliasId) -> Self { + RoomOrAliasId::from_borrowed(room_alias_id.as_str()) + } +} + impl From> for Box { fn from(room_id: Box) -> Self { RoomOrAliasId::from_owned(room_id.into_owned()) @@ -96,6 +108,28 @@ impl From> for Box { } } +impl<'a> TryFrom<&'a RoomOrAliasId> for &'a RoomId { + type Error = &'a RoomAliasId; + + fn try_from(id: &'a RoomOrAliasId) -> Result<&'a RoomId, &'a RoomAliasId> { + match id.variant() { + Variant::RoomId => Ok(RoomId::from_borrowed(id.as_str())), + Variant::RoomAliasId => Err(RoomAliasId::from_borrowed(id.as_str())), + } + } +} + +impl<'a> TryFrom<&'a RoomOrAliasId> for &'a RoomAliasId { + type Error = &'a RoomId; + + fn try_from(id: &'a RoomOrAliasId) -> Result<&'a RoomAliasId, &'a RoomId> { + match id.variant() { + Variant::RoomAliasId => Ok(RoomAliasId::from_borrowed(id.as_str())), + Variant::RoomId => Err(RoomId::from_borrowed(id.as_str())), + } + } +} + impl TryFrom> for Box { type Error = Box;