wrapper_events/
channel.rs1#[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}