use std::mem; use super::value::ProtobufValue; use crate::singular::*; pub trait ReflectOptional: 'static { fn to_option(&self) -> Option<&dyn ProtobufValue>; fn set_value(&mut self, value: &dyn ProtobufValue); } impl ReflectOptional for Option { fn to_option(&self) -> Option<&dyn ProtobufValue> { self.as_ref().map(|v| v as &dyn ProtobufValue) } fn set_value(&mut self, value: &dyn ProtobufValue) { match value.as_any().downcast_ref::() { Some(v) => mem::replace(self, Some(v.clone())), None => panic!(), }; } } impl ReflectOptional for SingularField { fn to_option(&self) -> Option<&dyn ProtobufValue> { self.as_ref().map(|v| v as &dyn ProtobufValue) } fn set_value(&mut self, value: &dyn ProtobufValue) { match value.as_any().downcast_ref::() { Some(v) => mem::replace(self, SingularField::some(v.clone())), None => panic!(), }; } } impl ReflectOptional for SingularPtrField { fn to_option(&self) -> Option<&dyn ProtobufValue> { self.as_ref().map(|v| v as &dyn ProtobufValue) } fn set_value(&mut self, value: &dyn ProtobufValue) { match value.as_any().downcast_ref::() { Some(v) => mem::replace(self, SingularPtrField::some(v.clone())), None => panic!(), }; } }