1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
use std::num::NonZeroU8;
use crate::{error::MxcUriError, server_name};
const PROTOCOL: &str = "mxc://";
pub fn validate(uri: &str) -> Result<NonZeroU8, MxcUriError> {
let uri = match uri.strip_prefix(PROTOCOL) {
Some(uri) => uri,
None => return Err(MxcUriError::WrongSchema),
};
let index = match uri.find('/') {
Some(index) => index,
None => return Err(MxcUriError::MissingSlash),
};
let server_name = &uri[..index];
let media_id = &uri[index + 1..];
let media_id_is_valid =
media_id.bytes().all(|b| matches!(b, b'0'..=b'9' | b'a'..=b'z' | b'A'..=b'Z' | b'-' ));
if !media_id_is_valid {
Err(MxcUriError::MediaIdMalformed)
} else if server_name::validate(server_name).is_err() {
Err(MxcUriError::ServerNameMalformed)
} else {
Ok(NonZeroU8::new((index + 6) as u8).unwrap())
}
}