spacegate_kernel/utils/
query_kv.rs

1/// A zero-copy query key-value iterator.
2///
3/// # Example
4/// ```rust
5/// # use spacegate_kernel::utils::QueryKvIter;
6/// # fn main() {
7/// let query = "a=1&b=2&c";
8/// let mut iter = QueryKvIter::new(query);
9/// assert_eq!(iter.next(), Some(("a", Some("1"))));
10/// assert_eq!(iter.next(), Some(("b", Some("2"))));
11/// assert_eq!(iter.next(), Some(("c", None)));
12/// # }
13/// ```
14#[derive(Debug)]
15pub struct QueryKvIter<'a> {
16    inner: &'a str,
17}
18
19impl<'a> QueryKvIter<'a> {
20    pub fn new(query: &'a str) -> Self {
21        Self { inner: query }
22    }
23}
24
25impl<'a> Iterator for QueryKvIter<'a> {
26    type Item = (&'a str, Option<&'a str>);
27
28    fn next(&mut self) -> Option<Self::Item> {
29        if self.inner.is_empty() {
30            return None;
31        }
32        match self.inner.split_once('&') {
33            Some((k, v)) => {
34                self.inner = v;
35                match k.split_once('=') {
36                    Some((k, v)) => Some((k, Some(v))),
37                    None => Some((k, None)),
38                }
39            }
40            None => {
41                let k = self.inner;
42                self.inner = "";
43                Some((k, None))
44            }
45        }
46    }
47}