use crate::{
ConfigError,
tree::{merge::OriginId, path::ConfigPath},
};
pub trait PartialValue: std::fmt::Debug + Clone + PartialEq {
type Resolved;
fn attribute(&mut self, origin: OriginId);
fn apply_defaults(&mut self);
fn resolve(self, path: &mut ConfigPath) -> Result<Self::Resolved, ConfigError>;
}
impl<T> PartialValue for Vec<T>
where
T: PartialValue,
{
type Resolved = Vec<T::Resolved>;
fn attribute(&mut self, origin: OriginId) {
for element in self {
element.attribute(origin);
}
}
fn apply_defaults(&mut self) {
for element in self {
element.apply_defaults();
}
}
fn resolve(self, path: &mut ConfigPath) -> Result<Self::Resolved, ConfigError> {
self.into_iter()
.enumerate()
.map(|(index, element)| path.at_index(index, |path| element.resolve(path)))
.collect()
}
}