Import protobuf-2.14.0
* Add OWNERS and Android.bp
* add generated version.rs into out
Bug: 143953733
Test: make
Change-Id: Ib53a973b74679c4dd78e2de2fa54141e55048c17
diff --git a/src/reflect/optional.rs b/src/reflect/optional.rs
new file mode 100644
index 0000000..4d33752
--- /dev/null
+++ b/src/reflect/optional.rs
@@ -0,0 +1,50 @@
+use std::mem;
+
+use super::value::ProtobufValue;
+
+use singular::*;
+
+pub trait ReflectOptional: 'static {
+ fn to_option(&self) -> Option<&ProtobufValue>;
+
+ fn set_value(&mut self, value: &ProtobufValue);
+}
+
+impl<V: ProtobufValue + Clone + 'static> ReflectOptional for Option<V> {
+ fn to_option(&self) -> Option<&ProtobufValue> {
+ self.as_ref().map(|v| v as &ProtobufValue)
+ }
+
+ fn set_value(&mut self, value: &ProtobufValue) {
+ match value.as_any().downcast_ref::<V>() {
+ Some(v) => mem::replace(self, Some(v.clone())),
+ None => panic!(),
+ };
+ }
+}
+
+impl<V: ProtobufValue + Clone + 'static> ReflectOptional for SingularField<V> {
+ fn to_option(&self) -> Option<&ProtobufValue> {
+ self.as_ref().map(|v| v as &ProtobufValue)
+ }
+
+ fn set_value(&mut self, value: &ProtobufValue) {
+ match value.as_any().downcast_ref::<V>() {
+ Some(v) => mem::replace(self, SingularField::some(v.clone())),
+ None => panic!(),
+ };
+ }
+}
+
+impl<V: ProtobufValue + Clone + 'static> ReflectOptional for SingularPtrField<V> {
+ fn to_option(&self) -> Option<&ProtobufValue> {
+ self.as_ref().map(|v| v as &ProtobufValue)
+ }
+
+ fn set_value(&mut self, value: &ProtobufValue) {
+ match value.as_any().downcast_ref::<V>() {
+ Some(v) => mem::replace(self, SingularPtrField::some(v.clone())),
+ None => panic!(),
+ };
+ }
+}