use crate::*;
pub trait OptionsFactory<T> {
fn create(&self, name: Option<&str>) -> Result<T, ValidateOptionsResult>;
}
#[derive(Default)]
pub struct DefaultOptionsFactory<T: Default> {
configurations: Vec<Ref<dyn ConfigureOptions<T>>>,
post_configurations: Vec<Ref<dyn PostConfigureOptions<T>>>,
validations: Vec<Ref<dyn ValidateOptions<T>>>,
}
impl<T: Default> DefaultOptionsFactory<T> {
pub fn new(
configurations: Vec<Ref<dyn ConfigureOptions<T>>>,
post_configurations: Vec<Ref<dyn PostConfigureOptions<T>>>,
validations: Vec<Ref<dyn ValidateOptions<T>>>,
) -> Self {
Self {
configurations,
post_configurations,
validations,
}
}
}
impl<T: Default> OptionsFactory<T> for DefaultOptionsFactory<T> {
fn create(&self, name: Option<&str>) -> Result<T, ValidateOptionsResult> {
let mut options = Default::default();
for configuration in &self.configurations {
configuration.configure(name, &mut options);
}
for configuration in &self.post_configurations {
configuration.post_configure(name, &mut options);
}
if !self.validations.is_empty() {
let mut failures = Vec::new();
for validation in &self.validations {
let result = validation.validate(name, &options);
if result.failed() {
failures.extend_from_slice(result.failures())
}
}
if !failures.is_empty() {
return Err(ValidateOptionsResult::fail_many(failures.iter()));
}
}
Ok(options)
}
}