#![deny(missing_docs)]
use std::{
collections::HashMap,
fmt::Display,
fs::File,
io::{BufRead, BufReader},
path::Path,
};
#[derive(Debug)]
pub enum Error {
OpeningFile,
ReadingFile,
MultipleKeys(String),
}
impl Display for Error {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::OpeningFile => write!(f, "Failed to open file"),
Self::ReadingFile => write!(f, "Error reading file"),
Self::MultipleKeys(key) => write!(f, "Duplicate key found: {key}"),
}
}
}
impl std::error::Error for Error {}
pub fn file_to_key_value_map(path: &Path) -> Result<HashMap<Box<str>, Box<str>>, Error> {
let Ok(file) = File::open(path) else {
return Err(Error::OpeningFile);
};
let reader = BufReader::new(file);
let mut map = HashMap::new();
for line in reader.lines() {
let Ok(line) = line else {
return Err(Error::ReadingFile);
};
if line.trim().is_empty() {
continue;
}
let Some(index) = line.find(|c: char| c.is_whitespace()) else {
continue;
};
let key = line[0..index].trim();
if map.contains_key(key) {
return Err(Error::MultipleKeys(key.to_string()));
}
let value = line[(index + 1)..].trim();
map.insert(key.into(), value.into());
}
Ok(map)
}