diff --git a/protobuf-test/src/common/v2/test_reflect.rs b/protobuf-test/src/common/v2/test_reflect.rs new file mode 100644 index 000000000..a3917e5dc --- /dev/null +++ b/protobuf-test/src/common/v2/test_reflect.rs @@ -0,0 +1,18 @@ +use super::test_reflect_pb::M; + +use protobuf::Message; + +#[ignore] // TODO +#[test] +fn test_get_sub_message_via_reflection() { + let mut m = M::new(); + m.mut_sub_m().set_n(42); + assert!(m.has_sub_m()); + + let descriptor = m.descriptor().field_by_name("sub_m"); + assert_eq!("sub_m", descriptor.name()); + + let sub_m = descriptor.get_message(&m); + assert_eq!("SubM", sub_m.descriptor().full_name()); + assert_eq!(42, sub_m.descriptor().field_by_name("n").get_i32(sub_m)); +} diff --git a/protobuf-test/src/common/v2/test_reflect_pb.proto b/protobuf-test/src/common/v2/test_reflect_pb.proto new file mode 100644 index 000000000..0f3c71696 --- /dev/null +++ b/protobuf-test/src/common/v2/test_reflect_pb.proto @@ -0,0 +1,9 @@ +syntax = "proto2"; + +message M { + optional SubM sub_m = 1; +} + +message SubM { + optional int32 n = 1; +} diff --git a/protobuf/src/reflect/accessor.rs b/protobuf/src/reflect/accessor.rs index f45c9532d..08e787dc3 100644 --- a/protobuf/src/reflect/accessor.rs +++ b/protobuf/src/reflect/accessor.rs @@ -1,5 +1,6 @@ use std::hash::Hash; use std::collections::HashMap; +use std::fmt; use core::Message; use core::ProtobufEnum; @@ -156,6 +157,23 @@ enum FieldAccessorFunctions { Map(Box>), } +impl fmt::Debug for FieldAccessorFunctions { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + match self { + &FieldAccessorFunctions::SingularHasGetSet { .. } => + write!(f, "SingularHasGetSet {{ .. }}"), + &FieldAccessorFunctions::Simple(..) => + write!(f, "Simple(..)"), + &FieldAccessorFunctions::Optional(..) => + write!(f, "Optional(..)"), + &FieldAccessorFunctions::Repeated(..) => + write!(f, "Repeated(..)"), + &FieldAccessorFunctions::Map(..) => + write!(f, "Map(..)"), + } + } +} + struct FieldAccessorImpl { name: &'static str, @@ -216,7 +234,7 @@ impl FieldAccessor for FieldAccessorImpl { FieldAccessorFunctions::SingularHasGetSet { get_set: SingularGetSet::Message(ref get), .. } => get.get_message(message_down_cast(m)), - _ => panic!(), + ref fns => panic!("unknown accessor type: {:?}", fns), } }