use serde::de::DeserializeOwned;
use std::path::Path;
#[derive(Debug, thiserror::Error)]
pub(crate) enum DocumentError {
#[error(transparent)]
Io(#[from] std::io::Error),
#[error(transparent)]
Json(#[from] serde_json::Error),
#[error(transparent)]
Toml(#[from] toml::de::Error),
#[error("files must use a .json or .toml suffix")]
UnsupportedFormat,
}
pub(crate) fn read_document<T: DeserializeOwned>(path: &Path) -> Result<T, DocumentError> {
let syntax = match path.extension().and_then(std::ffi::OsStr::to_str) {
Some(extension) if extension.eq_ignore_ascii_case("json") => true,
Some(extension) if extension.eq_ignore_ascii_case("toml") => false,
_ => return Err(DocumentError::UnsupportedFormat),
};
let text = std::fs::read_to_string(path)?;
if syntax {
Ok(serde_json::from_str(&text)?)
} else {
Ok(toml::from_str(&text)?)
}
}