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