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}