blob: f719a2c38976bd5275fc8f90eb744a2beefb4650 [file] [log] [blame]
Chih-Hung Hsiehcfc3a232020-06-10 20:13:05 -07001use std::mem;
2
3use super::value::ProtobufValue;
Haibo Huangd32e6ee2020-08-12 13:52:04 -07004use crate::singular::*;
Chih-Hung Hsiehcfc3a232020-06-10 20:13:05 -07005
6pub trait ReflectOptional: 'static {
Haibo Huang4bf8b462020-11-24 20:53:50 -08007 fn to_option(&self) -> Option<&dyn ProtobufValue>;
Chih-Hung Hsiehcfc3a232020-06-10 20:13:05 -07008
Haibo Huang4bf8b462020-11-24 20:53:50 -08009 fn set_value(&mut self, value: &dyn ProtobufValue);
Chih-Hung Hsiehcfc3a232020-06-10 20:13:05 -070010}
11
12impl<V: ProtobufValue + Clone + 'static> ReflectOptional for Option<V> {
Haibo Huang4bf8b462020-11-24 20:53:50 -080013 fn to_option(&self) -> Option<&dyn ProtobufValue> {
14 self.as_ref().map(|v| v as &dyn ProtobufValue)
Chih-Hung Hsiehcfc3a232020-06-10 20:13:05 -070015 }
16
Haibo Huang4bf8b462020-11-24 20:53:50 -080017 fn set_value(&mut self, value: &dyn ProtobufValue) {
Chih-Hung Hsiehcfc3a232020-06-10 20:13:05 -070018 match value.as_any().downcast_ref::<V>() {
19 Some(v) => mem::replace(self, Some(v.clone())),
20 None => panic!(),
21 };
22 }
23}
24
25impl<V: ProtobufValue + Clone + 'static> ReflectOptional for SingularField<V> {
Haibo Huang4bf8b462020-11-24 20:53:50 -080026 fn to_option(&self) -> Option<&dyn ProtobufValue> {
27 self.as_ref().map(|v| v as &dyn ProtobufValue)
Chih-Hung Hsiehcfc3a232020-06-10 20:13:05 -070028 }
29
Haibo Huang4bf8b462020-11-24 20:53:50 -080030 fn set_value(&mut self, value: &dyn ProtobufValue) {
Chih-Hung Hsiehcfc3a232020-06-10 20:13:05 -070031 match value.as_any().downcast_ref::<V>() {
32 Some(v) => mem::replace(self, SingularField::some(v.clone())),
33 None => panic!(),
34 };
35 }
36}
37
38impl<V: ProtobufValue + Clone + 'static> ReflectOptional for SingularPtrField<V> {
Haibo Huang4bf8b462020-11-24 20:53:50 -080039 fn to_option(&self) -> Option<&dyn ProtobufValue> {
40 self.as_ref().map(|v| v as &dyn ProtobufValue)
Chih-Hung Hsiehcfc3a232020-06-10 20:13:05 -070041 }
42
Haibo Huang4bf8b462020-11-24 20:53:50 -080043 fn set_value(&mut self, value: &dyn ProtobufValue) {
Chih-Hung Hsiehcfc3a232020-06-10 20:13:05 -070044 match value.as_any().downcast_ref::<V>() {
45 Some(v) => mem::replace(self, SingularPtrField::some(v.clone())),
46 None => panic!(),
47 };
48 }
49}