use crate::arnalisa::{Calibration, Sampling};
use crate::Result;
use arnalisa::bins::SourceSinkDescription;
use indexmap::{IndexMap, IndexSet};
pub trait LoadableDevice {
fn load_calibration_bin(
&self,
calibration_id: &str,
bin_id: &str,
) -> Result<SourceSinkDescription>;
fn load_calibration_bin_index(
&self,
calibration_id: &str,
) -> Result<IndexSet<String>>;
fn load_calibration_bins(
&self,
calibration_id: &str,
) -> Result<IndexMap<String, SourceSinkDescription>> {
self.load_calibration_bin_index(calibration_id)?
.into_iter()
.map(|id| {
let item =
self.load_calibration_bin(calibration_id, &id)?;
Ok((id, item))
})
.collect::<Result<_>>()
}
fn load_calibration(
&self,
calibration_id: &str,
) -> Result<Calibration> {
Ok(Calibration {
bins: self.load_calibration_bins(calibration_id)?,
})
}
fn load_sampling_bin(
&self,
sampling_id: &str,
bin_id: &str,
) -> Result<SourceSinkDescription>;
fn load_sampling_bin_index(
&self,
sampling_id: &str,
) -> Result<IndexSet<String>>;
fn load_sampling_bins(
&self,
sampling_id: &str,
) -> Result<IndexMap<String, SourceSinkDescription>> {
self.load_sampling_bin_index(sampling_id)?
.into_iter()
.map(|id| {
let item = self.load_sampling_bin(sampling_id, &id)?;
Ok((id, item))
})
.collect::<Result<_>>()
}
fn load_sampling(&self, sampling_id: &str) -> Result<Sampling> {
Ok(Sampling {
bins: self.load_sampling_bins(sampling_id)?,
})
}
}