Skip to main content

wrapper_events/
channel.rs

1#[derive(Clone, Debug, Eq, PartialEq)]
2pub struct ValidatedChannelString(String);
3
4impl ValidatedChannelString {
5    pub const MAX_BYTES: usize = 64;
6
7    pub fn new(raw: &str) -> Option<Self> {
8        if raw.is_empty() {
9            return None;
10        }
11        if raw.len() > Self::MAX_BYTES {
12            return None;
13        }
14        if !raw.is_ascii() {
15            return None;
16        }
17        let mut chars = raw.chars();
18        let first = chars.next()?;
19        if !is_alnum(first) {
20            return None;
21        }
22        for ch in chars {
23            if !(is_alnum(ch) || matches!(ch, '.' | '_' | '/' | '-')) {
24                return None;
25            }
26        }
27        Some(Self(raw.to_string()))
28    }
29
30    pub fn as_str(&self) -> &str {
31        &self.0
32    }
33}
34
35fn is_alnum(ch: char) -> bool {
36    ch.is_ascii_alphanumeric()
37}