use anyhow::Result;
use serde::de::DeserializeOwned;
use crate::{load_named_records, Dict};
pub struct StructLoader<T>
where
T: DeserializeOwned,
{
pub filename: String,
pub base_dir: String,
named_records: Option<Dict<T>>,
}
impl<T> StructLoader<T>
where
T: DeserializeOwned,
{
pub fn new(filename: &str, base_dir: &str) -> Self {
Self {
filename: filename.to_string(),
base_dir: base_dir.to_string(),
named_records: None,
}
}
pub fn load(&mut self, dependencies: &Dict<String>) -> Result<&Self> {
if self.named_records.is_some() {
return Err(anyhow::anyhow!(
"filename : {} the records have been loaded already",
self.filename,
));
}
let records = load_named_records::<T>(&self.filename, &self.base_dir, dependencies)?;
self.set_records(records)?;
Ok(self)
}
pub fn get(&self, key: &str) -> Result<&T> {
let records = self.get_records()?;
records.get(key).ok_or_else(|| {
anyhow::anyhow!(
"{}: no record was found referred by the key: {}",
self.filename,
key,
)
})
}
pub fn get_all_records(&self) -> Result<&Dict<T>> {
self.get_records()
}
fn set_records(&mut self, named_records: Dict<T>) -> Result<()> {
if self.named_records.is_some() {
return Err(anyhow::anyhow!(
"filename : {} the records have been loaded already",
self.filename,
));
}
self.named_records = Some(named_records);
Ok(())
}
fn get_records(&self) -> Result<&Dict<T>> {
self.named_records.as_ref().ok_or_else(|| {
anyhow::anyhow!(
"filename : {} no records have been loaded yet",
self.filename,
)
})
}
}