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