Add unicode compatibility for identifiers

Fix issue with unicode character boundaries in parse_id.
Add Unit test for unicode room aliases.
This commit is contained in:
Digital 2018-04-04 14:31:16 +02:00
parent 2de6d5dc0a
commit 3a4041982c

View File

@ -210,16 +210,12 @@ fn validate_id<'a>(id: &'a str) -> Result<(), Error> {
fn parse_id<'a>(required_sigil: char, id: &'a str) -> Result<(&'a str, Host, u16), Error> { fn parse_id<'a>(required_sigil: char, id: &'a str) -> Result<(&'a str, Host, u16), Error> {
validate_id(id)?; validate_id(id)?;
let mut chars = id.chars(); if !id.starts_with(required_sigil) {
let sigil = chars.nth(0).expect("ID missing first character.");
if sigil != required_sigil {
return Err(Error::MissingSigil); return Err(Error::MissingSigil);
} }
let delimiter_index = match chars.position(|c| c == ':') { let delimiter_index = match id.find(':') {
Some(index) => index + 1, Some(index) => index,
None => return Err(Error::MissingDelimiter), None => return Err(Error::MissingDelimiter),
}; };
@ -922,6 +918,16 @@ mod tests {
); );
} }
#[test]
fn valid_room_alias_id_unicode() {
assert_eq!(
RoomAliasId::try_from("#老虎£я:example.com")
.expect("Failed to create RoomAliasId.")
.to_string(),
"#老虎£я:example.com"
);
}
#[test] #[test]
fn missing_room_alias_id_sigil() { fn missing_room_alias_id_sigil() {
assert_eq!( assert_eq!(
@ -953,6 +959,7 @@ mod tests {
Error::InvalidHost Error::InvalidHost
); );
} }
#[test] #[test]
fn valid_room_id() { fn valid_room_id() {
assert_eq!( assert_eq!(