use std::collections::HashMap;
use std::fs::File;
use std::io::{BufRead, BufReader};
#[derive(Clone)]
pub struct CfgData{
pub numeric: Vec<f64>,
pub string: String
}
pub fn load(filename: &str) -> Result<HashMap<String, CfgData>, std::io::Error> {
let mut config: HashMap<String, CfgData> = HashMap::new();
let file: File;
match File::open(filename){
Ok(f) => file = f,
Err(e) => return Err(e)
}
let reader = BufReader::new(file);
for line in reader.lines() {
let line_read: String;
match line{
Ok(l) => line_read = l,
Err(e) => return Err(e)
}
if !line_read.contains("="){
continue;
}
let mut line_contents: &str = &line_read;
if line_read.contains("#"){
(line_contents, _) = line_read.split_once('#').unwrap();
}
let values = line_contents.split("=");
let mut key: String = String::from("");
let mut val = CfgData{numeric: Vec::<f64>::new(), string: String::from("")};
for (i, mut item) in values.enumerate() {
item = item.trim();
if i == 0 {
key = String::from(item);
}
if i > 0 && !item.contains(",") {
let parsed = item.parse::<f64>();
match parsed {
Ok(v) => val.numeric.push(v),
Err(_) => {
val.string = String::from(item);
}
}
}
else if i > 0 && item.contains(",") {
let subitems = item.split(",");
for mut subitem in subitems{
subitem = subitem.trim();
let parsed = subitem.parse::<f64>();
match parsed {
Ok(v) => val.numeric.push(v),
Err(_) => {
val.numeric = Vec::<f64>::new();
val.string = String::from(item);
break;
}
}
}
}
config.insert(key.clone(), val.clone());
}
}
return Ok(config);
}