From 2e0a6909cbfb2479edd7fba78fa4d0135a79ae3f Mon Sep 17 00:00:00 2001 From: Benedict Börger Date: Sat, 23 Mar 2019 15:40:35 +0100 Subject: [global] refactoring code base --- src/parsers/ini/mod.rs | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 src/parsers/ini/mod.rs (limited to 'src/parsers/ini') diff --git a/src/parsers/ini/mod.rs b/src/parsers/ini/mod.rs new file mode 100644 index 0000000..9633231 --- /dev/null +++ b/src/parsers/ini/mod.rs @@ -0,0 +1,64 @@ +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 }) + } + +} -- cgit v1.2.3-70-g09d2