use crate::{
property::{FromValue, Kind, NoMeta, ValueMut},
Error, PropertyValueEnum,
};
#[derive(Debug, PartialEq)]
pub struct ValueSlot<'a, M = NoMeta> {
pinned: Option<Kind>,
value: &'a mut PropertyValueEnum<M>,
}
impl<'a, M> ValueSlot<'a, M> {
pub(crate) fn pinned(kind: Kind, value: &'a mut PropertyValueEnum<M>) -> Self {
Self {
pinned: Some(kind),
value,
}
}
pub(crate) fn free(value: &'a mut PropertyValueEnum<M>) -> Self {
Self {
pinned: None,
value,
}
}
pub(crate) fn into_inner(self) -> &'a mut PropertyValueEnum<M> {
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<M> {
self.value
}
#[inline(always)]
pub fn as_mut(&mut self) -> ValueMut<'_, M> {
self.value.as_mut()
}
#[inline(always)]
#[must_use]
pub fn get_mut<T: FromValue<M>>(&mut self) -> Option<&mut T> {
self.value.get_mut()
}
pub fn set(&mut self, value: PropertyValueEnum<M>) -> Result<PropertyValueEnum<M>, 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))
}
}