rpc_api/rpc/
properties.rs1use 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}