1 use crate::reflect::value::value_ref::ReflectValueMut; 2 use crate::reflect::ReflectOptionalRef; 3 use crate::reflect::ReflectValueBox; 4 use crate::reflect::RuntimeType; 5 6 #[derive(Debug, Clone)] 7 pub(crate) struct DynamicOptional { 8 elem: RuntimeType, 9 value: Option<ReflectValueBox>, 10 } 11 12 impl DynamicOptional { none(elem: RuntimeType) -> DynamicOptional13 pub(crate) fn none(elem: RuntimeType) -> DynamicOptional { 14 DynamicOptional { elem, value: None } 15 } 16 mut_or_default(&mut self) -> ReflectValueMut17 pub(crate) fn mut_or_default(&mut self) -> ReflectValueMut { 18 if let None = self.value { 19 self.value = Some(self.elem.default_value_ref().to_box()); 20 } 21 self.value.as_mut().unwrap().as_value_mut() 22 } 23 clear(&mut self)24 pub(crate) fn clear(&mut self) { 25 self.value = None; 26 } 27 set(&mut self, value: ReflectValueBox)28 pub(crate) fn set(&mut self, value: ReflectValueBox) { 29 assert_eq!(value.get_type(), self.elem); 30 self.value = Some(value); 31 } 32 reflect_singlar_ref(&self) -> ReflectOptionalRef33 pub(crate) fn reflect_singlar_ref(&self) -> ReflectOptionalRef { 34 match &self.value { 35 Some(value) => ReflectOptionalRef::some(value.as_value_ref()), 36 None => ReflectOptionalRef::none(self.elem.clone()), 37 } 38 } 39 } 40