toolcraft_utils/utils/
string_util.rs1pub trait QueryExtractor {
3 fn extract_value(&self, key: &str) -> Option<&str>;
13}
14
15impl<T: AsRef<str>> QueryExtractor for T {
16 fn extract_value(&self, key: &str) -> Option<&str> {
22 self.as_ref().split('&').find_map(|pair| {
23 let mut parts = pair.split('=');
24 let k = parts.next()?;
25 let v = parts.next()?;
26 if k == key { Some(v) } else { None }
27 })
28 }
29}
30
31#[cfg(test)]
32mod tests {
33 use super::QueryExtractor;
34
35 #[test]
37 fn test_extract_value() {
38 let query = "key1=val1&key2=val2&key3=val3";
39 let query_string = String::from(query);
40
41 assert_eq!(query.extract_value("key1"), Some("val1"));
42 assert_eq!(query.extract_value("key2"), Some("val2"));
43 assert_eq!(query.extract_value("key3"), Some("val3"));
44 assert_eq!(query.extract_value("key4"), None);
45
46 assert_eq!(query_string.extract_value("key1"), Some("val1"));
47 assert_eq!(query_string.extract_value("key2"), Some("val2"));
48 assert_eq!(query_string.extract_value("key3"), Some("val3"));
49 assert_eq!(query_string.extract_value("key4"), None);
50 }
51
52 #[test]
54 fn test_extract_value_empty() {
55 let query = "";
56 let query_string = String::from(query);
57
58 assert_eq!(query.extract_value("key1"), None);
59 assert_eq!(query_string.extract_value("key1"), None);
60 }
61
62 #[test]
64 fn test_extract_value_no_value() {
65 let query = "key1=&key2=val2";
66 let query_string = String::from(query);
67
68 assert_eq!(query.extract_value("key1"), Some(""));
69 assert_eq!(query.extract_value("key2"), Some("val2"));
70
71 assert_eq!(query_string.extract_value("key1"), Some(""));
72 assert_eq!(query_string.extract_value("key2"), Some("val2"));
73 }
74
75 #[test]
78 fn test_extract_value_multiple_keys() {
79 let query = "key1=val1&key1=val2&key3=val3";
80 let query_string = String::from(query);
81
82 assert_eq!(query.extract_value("key1"), Some("val1")); assert_eq!(query.extract_value("key3"), Some("val3"));
84
85 assert_eq!(query_string.extract_value("key1"), Some("val1")); assert_eq!(query_string.extract_value("key3"), Some("val3"));
87 }
88
89 #[test]
91 fn test_extract_value_malformed_query() {
92 let query = "key1=val1&key2&key3=val3";
93 let query_string = String::from(query);
94
95 assert_eq!(query.extract_value("key1"), Some("val1"));
96 assert_eq!(query.extract_value("key2"), None);
97 assert_eq!(query.extract_value("key3"), Some("val3"));
98
99 assert_eq!(query_string.extract_value("key1"), Some("val1"));
100 assert_eq!(query_string.extract_value("key2"), None);
101 assert_eq!(query_string.extract_value("key3"), Some("val3"));
102 }
103}