1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
use super::{name::*, parse::*, value::*};
#[derive(Debug)]
pub struct Params<'a> {
source: ParamsSource<'a>,
index: usize,
}
impl<'a> Params<'a> {
pub(crate) fn from_slice(s: &'a [(Name<'a>, Value<'a>)]) -> Self {
Self {
source: ParamsSource::Slice(s),
index: 0,
}
}
pub(crate) fn from_indices(s: &'a str, i: &'a Indices) -> Self {
Self {
source: ParamsSource::Indices(s, i),
index: 0,
}
}
}
#[derive(Debug)]
enum ParamsSource<'a> {
Slice(&'a [(Name<'a>, Value<'a>)]),
Indices(&'a str, &'a Indices),
}
impl<'a> Iterator for Params<'a> {
type Item = (Name<'a>, Value<'a>);
fn next(&mut self) -> Option<Self::Item> {
let index = self.index;
match self.source {
ParamsSource::Slice(s) => {
if index >= s.len() {
None
} else {
self.index += 1;
Some((s[index].0, s[index].1))
}
}
ParamsSource::Indices(s, i) => {
if index >= i.params().len() {
None
} else {
self.index += 1;
let param = i.params()[index];
Some((
Name::new_unchecked(&s[param[0] as usize..param[1] as usize]),
Value::new_unchecked(&s[param[2] as usize..param[3] as usize]),
))
}
}
}
}
fn size_hint(&self) -> (usize, Option<usize>) {
let len = match self.source {
ParamsSource::Slice(s) => s.len(),
ParamsSource::Indices(_, i) => i.params().len(),
};
(len, Some(len))
}
}
pub trait ReadParams {
fn params(&self) -> Params;
fn get_param(&self, name: Name) -> Option<Value>;
}
pub trait WriteParams<'a>: ReadParams {
fn set_param<'n: 'a, 'v: 'a>(&mut self, name: Name<'n>, value: Value<'v>);
fn remove_params(&mut self, name: Name);
fn clear_params(&mut self);
}