blob: f81f9736b01dc2893d585e5bffb5bce70841e320 [file] [log] [blame]
Chih-Hung Hsiehcfc3a232020-06-10 20:13:05 -07001use std::mem;
2
3use super::value::ProtobufValue;
4
Haibo Huangd32e6ee2020-08-12 13:52:04 -07005use crate::singular::*;
Chih-Hung Hsiehcfc3a232020-06-10 20:13:05 -07006
7pub trait ReflectOptional: 'static {
Haibo Huang4bf8b462020-11-24 20:53:50 -08008 fn to_option(&self) -> Option<&dyn ProtobufValue>;
Chih-Hung Hsiehcfc3a232020-06-10 20:13:05 -07009
Haibo Huang4bf8b462020-11-24 20:53:50 -080010 fn set_value(&mut self, value: &dyn ProtobufValue);
Chih-Hung Hsiehcfc3a232020-06-10 20:13:05 -070011}
12
13impl<V: ProtobufValue + Clone + 'static> ReflectOptional for Option<V> {
Haibo Huang4bf8b462020-11-24 20:53:50 -080014 fn to_option(&self) -> Option<&dyn ProtobufValue> {
15 self.as_ref().map(|v| v as &dyn ProtobufValue)
Chih-Hung Hsiehcfc3a232020-06-10 20:13:05 -070016 }
17
Haibo Huang4bf8b462020-11-24 20:53:50 -080018 fn set_value(&mut self, value: &dyn ProtobufValue) {
Chih-Hung Hsiehcfc3a232020-06-10 20:13:05 -070019 match value.as_any().downcast_ref::<V>() {
20 Some(v) => mem::replace(self, Some(v.clone())),
21 None => panic!(),
22 };
23 }
24}
25
26impl<V: ProtobufValue + Clone + 'static> ReflectOptional for SingularField<V> {
Haibo Huang4bf8b462020-11-24 20:53:50 -080027 fn to_option(&self) -> Option<&dyn ProtobufValue> {
28 self.as_ref().map(|v| v as &dyn ProtobufValue)
Chih-Hung Hsiehcfc3a232020-06-10 20:13:05 -070029 }
30
Haibo Huang4bf8b462020-11-24 20:53:50 -080031 fn set_value(&mut self, value: &dyn ProtobufValue) {
Chih-Hung Hsiehcfc3a232020-06-10 20:13:05 -070032 match value.as_any().downcast_ref::<V>() {
33 Some(v) => mem::replace(self, SingularField::some(v.clone())),
34 None => panic!(),
35 };
36 }
37}
38
39impl<V: ProtobufValue + Clone + 'static> ReflectOptional for SingularPtrField<V> {
Haibo Huang4bf8b462020-11-24 20:53:50 -080040 fn to_option(&self) -> Option<&dyn ProtobufValue> {
41 self.as_ref().map(|v| v as &dyn ProtobufValue)
Chih-Hung Hsiehcfc3a232020-06-10 20:13:05 -070042 }
43
Haibo Huang4bf8b462020-11-24 20:53:50 -080044 fn set_value(&mut self, value: &dyn ProtobufValue) {
Chih-Hung Hsiehcfc3a232020-06-10 20:13:05 -070045 match value.as_any().downcast_ref::<V>() {
46 Some(v) => mem::replace(self, SingularPtrField::some(v.clone())),
47 None => panic!(),
48 };
49 }
50}