use std::ops::Deref;
use qubit_value::MultiValues;
use qubit_value::multi_values::{
MultiValuesAddArg, MultiValuesAdder, MultiValuesMultiAdder, MultiValuesSetArg,
MultiValuesSetter, MultiValuesSetterSlice, MultiValuesSingleSetter,
};
use crate::{ConfigError, ConfigResult, Property};
pub struct ConfigPropertyMut<'a> {
property: &'a mut Property,
}
impl<'a> ConfigPropertyMut<'a> {
#[inline]
pub(crate) fn new(property: &'a mut Property) -> Self {
Self { property }
}
#[inline]
pub fn as_property(&self) -> &Property {
self.property
}
#[inline]
pub fn set_description(&mut self, description: Option<String>) -> ConfigResult<()> {
self.ensure_not_final()?;
self.property.set_description(description);
Ok(())
}
#[inline]
pub fn set_final(&mut self, is_final: bool) -> ConfigResult<()> {
if self.property.is_final() && !is_final {
return Err(ConfigError::PropertyIsFinal(
self.property.name().to_string(),
));
}
self.property.set_final(is_final);
Ok(())
}
#[inline]
pub fn set_value(&mut self, value: MultiValues) -> ConfigResult<()> {
self.ensure_not_final()?;
self.property.set_value(value);
Ok(())
}
pub fn set<S>(&mut self, values: S) -> ConfigResult<()>
where
S: for<'b> MultiValuesSetArg<'b>,
<S as MultiValuesSetArg<'static>>::Item: Clone,
MultiValues: MultiValuesSetter<<S as MultiValuesSetArg<'static>>::Item>
+ MultiValuesSetterSlice<<S as MultiValuesSetArg<'static>>::Item>
+ MultiValuesSingleSetter<<S as MultiValuesSetArg<'static>>::Item>,
{
self.ensure_not_final()?;
self.property.set(values).map_err(ConfigError::from)
}
pub fn add<S>(&mut self, values: S) -> ConfigResult<()>
where
S: for<'b> MultiValuesAddArg<'b, Item = <S as MultiValuesSetArg<'static>>::Item>
+ for<'b> MultiValuesSetArg<'b>,
<S as MultiValuesSetArg<'static>>::Item: Clone,
MultiValues: MultiValuesAdder<<S as MultiValuesSetArg<'static>>::Item>
+ MultiValuesMultiAdder<<S as MultiValuesSetArg<'static>>::Item>
+ MultiValuesSetter<<S as MultiValuesSetArg<'static>>::Item>
+ MultiValuesSetterSlice<<S as MultiValuesSetArg<'static>>::Item>
+ MultiValuesSingleSetter<<S as MultiValuesSetArg<'static>>::Item>,
{
self.ensure_not_final()?;
self.property.add(values).map_err(ConfigError::from)
}
#[inline]
pub fn clear(&mut self) -> ConfigResult<()> {
self.ensure_not_final()?;
self.property.clear();
Ok(())
}
#[inline]
fn ensure_not_final(&self) -> ConfigResult<()> {
if self.property.is_final() {
return Err(ConfigError::PropertyIsFinal(
self.property.name().to_string(),
));
}
Ok(())
}
}
impl Deref for ConfigPropertyMut<'_> {
type Target = Property;
#[inline]
fn deref(&self) -> &Self::Target {
self.property
}
}