blob: 9633231a4e75a0f106f2c95a2fa977fa6094fb37 (
plain)
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
|
use std::fs::File;
use std::io;
use std::io::BufRead;
use std::collections::HashMap;
pub struct IniFile {
pub section : HashMap<String, Vec<IniSection>>
}
pub struct IniSection {
pub section_name : String,
pub properties : HashMap<String, Vec<String>>
}
impl IniFile {
pub fn from_file(path : &str) -> Result<IniFile, io::Error> {
let mut file = HashMap::new();
let fd = File::open(path)?;
let reader = io::BufReader::new(fd);
let mut current_section = String::from("");
for line in reader.lines() {
let line = line?;
let line = line.trim().to_string();
if line.starts_with("#") || line.is_empty() {
println!("kommentar or empts: {}", line);
continue;
}
// another section begins
if line.starts_with("[") && line.ends_with("]") {
let nam = line.get(1..(line.len()-1));
let n;
match nam {
Some(sec_name) => n = sec_name,
// TODO no name given, what should be done
None => n = ""
}
current_section = n.to_string();
// TODO maybe the sections has been specified twice?
file.insert(n.to_string(), Vec::new() );
continue;
}
let kv : Vec<&str> = line.split("=").collect();
let mut key = String::from("");
if let Some(t) = kv.get(0) {
key = t.to_string();
}
let mut value = String::from("");
if let Some(t) = kv.get(1) {
value = t.to_string();
}
if let Some(section) = file.get_mut(¤t_section) {
// get the entry with key from vector
if let Some(ent) = section.get_mut(&key) {
ent.insert(value.to_string());
}
}
}
Ok(IniFile { sections : file })
}
}
|