rpc_api/rpc/
properties.rs

1use std::collections::HashMap;
2use std::iter::Map;
3
4pub fn properties(content: &str) -> HashMap<String, String> {
5    content.replace("\r\n", "\n").split("\n").filter_map(|line| {
6        let mut parts = line.splitn(2, "=");
7        Some((parts.next()?.to_string(), parts.next()?.to_string()))
8    }).into_iter().collect()
9}
10
11#[cfg(test)]
12mod test {
13    use std::iter::Map;
14
15    use crate::rpc::properties::properties;
16
17    fn fix(string: &str, sep: &str) -> String {
18        string.replace("\t", sep)
19    }
20
21    #[test]
22    fn test() {
23        fn rt(sep: &str) {
24            let target = properties(&fix("name=foo\tage=42", sep));
25
26            assert_eq!("foo", target["name"]);
27            assert_eq!("42", target["age"]);
28        }
29        rt("\n");
30        rt("\r\n");
31    }
32
33    #[test]
34    fn test_empty_lines() {
35        fn rt(sep: &str) {
36            let target = properties(&fix("\t\tname=foo\tage=42", sep));
37
38            assert_eq!("foo", target["name"]);
39            assert_eq!("42", target["age"]);
40        }
41        rt("\n");
42        rt("\r\n");
43    }
44
45    #[test]
46    fn test_eq_blank() {
47        fn rt(sep: &str) {
48            let target = properties(&fix("name=", sep));
49            assert_eq!("", target["name"]);
50
51            let target = properties(&fix("\tname=\t", sep));
52            assert_eq!("", target["name"]);
53        }
54        rt("\n");
55        rt("\r\n");
56    }
57
58    #[test]
59    fn test_without_equal() {
60        fn rt(sep: &str) {
61            let target = properties(&fix("name\t\t", sep));
62            assert!(!target.contains_key("name"));
63
64            let target = properties(&fix("\tname\t", sep));
65            assert!(!target.contains_key("name"));
66        }
67        rt("\n");
68        rt("\r\n");
69    }
70}