kv_parser/
lib.rs

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}