• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 use std::mem;
2 
3 use super::value::ProtobufValue;
4 use crate::singular::*;
5 
6 pub trait ReflectOptional: 'static {
to_option(&self) -> Option<&dyn ProtobufValue>7     fn to_option(&self) -> Option<&dyn ProtobufValue>;
8 
set_value(&mut self, value: &dyn ProtobufValue)9     fn set_value(&mut self, value: &dyn ProtobufValue);
10 }
11 
12 impl<V: ProtobufValue + Clone + 'static> ReflectOptional for Option<V> {
to_option(&self) -> Option<&dyn ProtobufValue>13     fn to_option(&self) -> Option<&dyn ProtobufValue> {
14         self.as_ref().map(|v| v as &dyn ProtobufValue)
15     }
16 
set_value(&mut self, value: &dyn ProtobufValue)17     fn set_value(&mut self, value: &dyn ProtobufValue) {
18         match value.as_any().downcast_ref::<V>() {
19             Some(v) => mem::replace(self, Some(v.clone())),
20             None => panic!(),
21         };
22     }
23 }
24 
25 impl<V: ProtobufValue + Clone + 'static> ReflectOptional for SingularField<V> {
to_option(&self) -> Option<&dyn ProtobufValue>26     fn to_option(&self) -> Option<&dyn ProtobufValue> {
27         self.as_ref().map(|v| v as &dyn ProtobufValue)
28     }
29 
set_value(&mut self, value: &dyn ProtobufValue)30     fn set_value(&mut self, value: &dyn ProtobufValue) {
31         match value.as_any().downcast_ref::<V>() {
32             Some(v) => mem::replace(self, SingularField::some(v.clone())),
33             None => panic!(),
34         };
35     }
36 }
37 
38 impl<V: ProtobufValue + Clone + 'static> ReflectOptional for SingularPtrField<V> {
to_option(&self) -> Option<&dyn ProtobufValue>39     fn to_option(&self) -> Option<&dyn ProtobufValue> {
40         self.as_ref().map(|v| v as &dyn ProtobufValue)
41     }
42 
set_value(&mut self, value: &dyn ProtobufValue)43     fn set_value(&mut self, value: &dyn ProtobufValue) {
44         match value.as_any().downcast_ref::<V>() {
45             Some(v) => mem::replace(self, SingularPtrField::some(v.clone())),
46             None => panic!(),
47         };
48     }
49 }
50