use std::fs::File; use std::io; use std::io::BufRead; use std::collections::HashMap; pub struct IniFile { pub section : HashMap> } pub struct IniSection { pub section_name : String, pub properties : HashMap> } impl IniFile { pub fn from_file(path : &str) -> Result { 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 }) } }