1use std::{
2 collections::HashMap,
3 fs::File,
4 io::{BufRead, BufReader},
5};
6
7#[derive(Debug)]
8pub enum Error {
9 OpeningFile,
10 MultipleKeys(String),
11}
12
13pub fn file_to_key_value_map(path: &str) -> Result<HashMap<String, String>, Error> {
14 let file = if let Ok(file) = File::open(path) {
15 file
16 } else {
17 return Err(Error::OpeningFile);
18 };
19 let reader = BufReader::new(file);
20
21 let mut map = HashMap::new();
22
23 for line in reader.lines() {
24 if let Ok(line) = line {
25 if !line.trim().is_empty() {
26 if let Some(index) = line.find(|c: char| c.is_whitespace()) {
27 let key = line[0..index].trim();
28 if map.contains_key(key) {
29 return Err(Error::MultipleKeys(key.to_string()));
30 }
31 let value = line[(index + 1)..].trim();
32 map.insert(key.to_string(), value.to_string());
33 }
34 }
35 }
36 }
37
38 Ok(map)
39}