serde_teamspeak_querystring/de/
mod.rs1mod 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}