use crate::reflect::value::value_ref::ReflectValueMut; use crate::reflect::ReflectOptionalRef; use crate::reflect::ReflectValueBox; use crate::reflect::RuntimeType; #[derive(Debug, Clone)] pub(crate) struct DynamicOptional { elem: RuntimeType, value: Option, } impl DynamicOptional { pub(crate) fn none(elem: RuntimeType) -> DynamicOptional { DynamicOptional { elem, value: None } } pub(crate) fn mut_or_default(&mut self) -> ReflectValueMut { if let None = self.value { self.value = Some(self.elem.default_value_ref().to_box()); } self.value.as_mut().unwrap().as_value_mut() } pub(crate) fn clear(&mut self) { self.value = None; } pub(crate) fn set(&mut self, value: ReflectValueBox) { assert_eq!(value.get_type(), self.elem); self.value = Some(value); } pub(crate) fn reflect_singlar_ref(&self) -> ReflectOptionalRef { match &self.value { Some(value) => ReflectOptionalRef::some(value.as_value_ref()), None => ReflectOptionalRef::none(self.elem.clone()), } } }