rust_util/
util_str.rs

1/// Split string to lines, splited by '\r', '\n' or "\r\n"
2pub fn read_str_to_lines(s: &str) -> Vec<String> {
3    s.lines().map(|ln| ln.to_owned()).collect()
4}
5
6pub fn split_kv(s: &str, split: char) -> (String, String) {
7    let mut k = String::new();
8    let mut v = String::new();
9
10    let mut is_splited = false;
11    let cs = s.chars();
12    for c in cs {
13        if is_splited {
14            v.push(c);
15        } else if c == split {
16            is_splited = true;
17        } else {
18            k.push(c);
19        }
20    }
21
22    (k, v)
23}
24
25
26#[test]
27fn test_split_kv() {
28    assert_eq!(("".to_owned(), "".to_owned()), split_kv("", '='));
29    assert_eq!(("aaaa".to_owned(), "".to_owned()), split_kv("aaaa", '='));
30    assert_eq!(("".to_owned(), "aaaa".to_owned()), split_kv("=aaaa", '='));
31    assert_eq!(("aa".to_owned(), "bb".to_owned()), split_kv("aa=bb", '='));
32    assert_eq!(("aa".to_owned(), "bb".to_owned()), split_kv("aa:bb", ':'));
33}
34
35#[test]
36fn test_read_str_to_lines() {
37    {
38        let s = "";
39        let lines = read_str_to_lines(s);
40        assert_eq!(lines.len(), 0);
41    }
42    {
43        let s = "\n";
44        let lines = read_str_to_lines(s);
45        assert_eq!(lines.len(), 1);
46    }
47    {
48        let s = "\r";
49        let lines = read_str_to_lines(s);
50        assert_eq!(lines.len(), 1);
51    }
52    {
53        let s = "\r\n";
54        let lines = read_str_to_lines(s);
55        assert_eq!(lines.len(), 1);
56    }
57    {
58        let s = "aa\r\nbb";
59        let lines = read_str_to_lines(s);
60        assert_eq!(lines.len(), 2);
61        assert_eq!(lines[0], "aa");
62        assert_eq!(lines[1], "bb");
63    }
64    {
65        let s = "aa\r\nbb\ncc";
66        let lines = read_str_to_lines(s);
67        assert_eq!(lines.len(), 3);
68        assert_eq!(lines[0], "aa");
69        assert_eq!(lines[1], "bb");
70        assert_eq!(lines[2], "cc");
71    }
72}