use descriptor::{FieldDescriptorProto, FieldDescriptorProto_Label};
use reflect::accessor::FieldAccessor;
use reflect::map::ReflectMap;
use reflect::repeated::ReflectRepeated;
use reflect::{EnumValueDescriptor, ReflectValueRef};
use Message;
pub enum ReflectFieldRef<'a> {
Optional(Option<ReflectValueRef<'a>>),
Repeated(&'a ReflectRepeated),
Map(&'a ReflectMap),
}
pub struct FieldDescriptor {
proto: &'static FieldDescriptorProto,
accessor: Box<FieldAccessor + 'static>,
}
impl FieldDescriptor {
pub(crate) fn new(
accessor: Box<FieldAccessor + 'static>,
proto: &'static FieldDescriptorProto,
) -> FieldDescriptor {
assert_eq!(proto.get_name(), accessor.name_generic());
FieldDescriptor { proto, accessor }
}
pub fn proto(&self) -> &'static FieldDescriptorProto {
self.proto
}
pub fn name(&self) -> &'static str {
self.proto.get_name()
}
pub fn is_repeated(&self) -> bool {
self.proto.get_label() == FieldDescriptorProto_Label::LABEL_REPEATED
}
pub fn has_field(&self, m: &Message) -> bool {
self.accessor.has_field_generic(m)
}
pub fn len_field(&self, m: &dyn Message) -> usize {
self.accessor.len_field_generic(m)
}
pub fn get_message<'a>(&self, m: &'a dyn Message) -> &'a dyn Message {
self.accessor.get_message_generic(m)
}
pub fn get_enum(&self, m: &dyn Message) -> &'static EnumValueDescriptor {
self.accessor.get_enum_generic(m)
}
pub fn get_str<'a>(&self, m: &'a dyn Message) -> &'a str {
self.accessor.get_str_generic(m)
}
pub fn get_bytes<'a>(&self, m: &'a dyn Message) -> &'a [u8] {
self.accessor.get_bytes_generic(m)
}
pub fn get_u32(&self, m: &dyn Message) -> u32 {
self.accessor.get_u32_generic(m)
}
pub fn get_u64(&self, m: &dyn Message) -> u64 {
self.accessor.get_u64_generic(m)
}
pub fn get_i32(&self, m: &dyn Message) -> i32 {
self.accessor.get_i32_generic(m)
}
pub fn get_i64(&self, m: &dyn Message) -> i64 {
self.accessor.get_i64_generic(m)
}
pub fn get_bool(&self, m: &dyn Message) -> bool {
self.accessor.get_bool_generic(m)
}
pub fn get_f32(&self, m: &dyn Message) -> f32 {
self.accessor.get_f32_generic(m)
}
pub fn get_f64(&self, m: &dyn Message) -> f64 {
self.accessor.get_f64_generic(m)
}
pub fn get_reflect<'a>(&self, m: &'a dyn Message) -> ReflectFieldRef<'a> {
self.accessor.get_reflect(m)
}
}