protobuf/reflect/dynamic/
optional.rs
1use crate::reflect::value::value_ref::ReflectValueMut;
2use crate::reflect::ReflectOptionalRef;
3use crate::reflect::ReflectValueBox;
4use crate::reflect::RuntimeType;
5
6#[derive(Debug, Clone)]
7pub(crate) struct DynamicOptional {
8 elem: RuntimeType,
9 value: Option<ReflectValueBox>,
10}
11
12impl DynamicOptional {
13 pub(crate) fn none(elem: RuntimeType) -> DynamicOptional {
14 DynamicOptional { elem, value: None }
15 }
16
17 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
24 pub(crate) fn clear(&mut self) {
25 self.value = None;
26 }
27
28 pub(crate) fn set(&mut self, value: ReflectValueBox) {
29 assert_eq!(value.get_type(), self.elem);
30 self.value = Some(value);
31 }
32
33 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}