serde_teamspeak_querystring/de/
mod.rs

1mod pair;
2mod stash;
3mod value;
4
5use stash::Stash;
6
7use self::pair::Pair;
8use crate::error::Result;
9
10struct KVParser<'de> {
11    slice: &'de [u8],
12}
13
14impl<'de> KVParser<'de> {
15    pub fn new(slice: &'de [u8]) -> Self {
16        Self { slice }
17    }
18
19    fn parse(self) -> Stash<'de> {
20        let mut stash = Stash::new();
21        for subslice in self.slice.split(|c| *c == b' ') {
22            if subslice.is_empty() {
23                continue;
24            }
25
26            let mut iter = subslice.splitn(2, |c| *c == b'=');
27            let key = iter.next().unwrap();
28            let value = iter.next();
29
30            stash.push(Pair::new(key, value));
31        }
32
33        stash
34    }
35}
36
37pub fn from_str<'de, T>(slice: &'de str) -> Result<T>
38where
39    T: serde::de::Deserialize<'de>,
40{
41    from_bytes(slice.as_bytes())
42}
43
44pub fn from_bytes<'de, T>(input: &'de [u8]) -> Result<T>
45where
46    T: serde::de::Deserialize<'de>,
47{
48    let de = KVParser::new(input).parse();
49    let res = serde::de::Deserialize::deserialize(de)?;
50    Ok(res)
51}
52
53pub fn escape(s: &str) -> String {
54    s.replace('\\', "\\\\")
55        .replace(' ', "\\s")
56        .replace('/', "\\/")
57}