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