use crate::{
property::{FromValue, Kind, ValueMut},
Error, PropertyValueEnum,
};
#[derive(Debug, PartialEq)]
pub struct ValueSlot<'a> {
pinned: Option<Kind>,
value: &'a mut PropertyValueEnum,
}
impl<'a> ValueSlot<'a> {
pub(crate) fn pinned(kind: Kind, value: &'a mut PropertyValueEnum) -> Self {
Self {
pinned: Some(kind),
value,
}
}
pub(crate) fn free(value: &'a mut PropertyValueEnum) -> Self {
Self {
pinned: None,
value,
}
}
pub(crate) fn into_inner(self) -> &'a mut PropertyValueEnum {
self.value
}
#[inline(always)]
#[must_use]
pub fn kind(&self) -> Kind {
self.value.kind()
}
#[inline(always)]
#[must_use]
pub fn pinned_kind(&self) -> Option<Kind> {
self.pinned
}
#[inline(always)]
#[must_use]
pub fn get(&self) -> &PropertyValueEnum {
self.value
}
#[inline(always)]
pub fn as_mut(&mut self) -> ValueMut<'_> {
self.value.as_mut()
}
#[inline(always)]
#[must_use]
pub fn get_mut<T: FromValue>(&mut self) -> Option<&mut T> {
self.value.get_mut()
}
pub fn set(&mut self, value: PropertyValueEnum) -> Result<PropertyValueEnum, Error> {
if let Some(pinned) = self.pinned {
if value.kind() != pinned {
return Err(Error::MismatchedContainerTypes {
expected: pinned,
got: value.kind(),
});
}
}
Ok(std::mem::replace(self.value, value))
}
}