pub(crate) mod case;
mod de;
mod ser;
use serde::{
de::{DeserializeSeed, Deserializer},
ser::{Serialize, Serializer},
};
use crate::{dynamic::message::DynamicMessage, message::MessageDescriptor};
#[derive(Debug, Clone)]
pub struct SerializeOptions {
pub(crate) stringify_64_bit_integers: bool,
pub(crate) use_enum_numbers: bool,
pub(crate) use_proto_field_name: bool,
pub(crate) skip_default_fields: bool,
}
impl Default for SerializeOptions {
fn default() -> Self {
Self::new()
}
}
impl SerializeOptions {
#[must_use]
pub const fn new() -> Self {
Self {
stringify_64_bit_integers: true,
use_enum_numbers: false,
use_proto_field_name: false,
skip_default_fields: true,
}
}
#[must_use]
pub const fn stringify_64_bit_integers(mut self, yes: bool) -> Self {
self.stringify_64_bit_integers = yes;
self
}
#[must_use]
pub const fn use_enum_numbers(mut self, yes: bool) -> Self {
self.use_enum_numbers = yes;
self
}
#[must_use]
pub const fn use_proto_field_name(mut self, yes: bool) -> Self {
self.use_proto_field_name = yes;
self
}
#[must_use]
pub const fn skip_default_fields(mut self, yes: bool) -> Self {
self.skip_default_fields = yes;
self
}
}
#[derive(Debug, Clone)]
pub struct DeserializeOptions {
pub(crate) deny_unknown_fields: bool,
}
impl Default for DeserializeOptions {
fn default() -> Self {
Self::new()
}
}
impl DeserializeOptions {
#[must_use]
pub const fn new() -> Self {
Self {
deny_unknown_fields: false,
}
}
#[must_use]
pub const fn deny_unknown_fields(mut self, yes: bool) -> Self {
self.deny_unknown_fields = yes;
self
}
}
impl Serialize for DynamicMessage {
fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
self.serialize_with_options(serializer, &SerializeOptions::default())
}
}
impl<'de> DeserializeSeed<'de> for MessageDescriptor {
type Value = DynamicMessage;
fn deserialize<D: Deserializer<'de>>(self, deserializer: D) -> Result<Self::Value, D::Error> {
DynamicMessage::deserialize(self, deserializer)
}
}
impl DynamicMessage {
pub fn serialize_with_options<S: Serializer>(
&self,
serializer: S,
options: &SerializeOptions,
) -> Result<S::Ok, S::Error> {
ser::serialize_message(self, serializer, options)
}
pub fn deserialize<'de, D: Deserializer<'de>>(
descriptor: MessageDescriptor,
deserializer: D,
) -> Result<Self, D::Error> {
Self::deserialize_with_options(descriptor, deserializer, &DeserializeOptions::default())
}
pub fn deserialize_with_options<'de, D: Deserializer<'de>>(
descriptor: MessageDescriptor,
deserializer: D,
options: &DeserializeOptions,
) -> Result<Self, D::Error> {
de::deserialize_message(&descriptor, deserializer, options)
}
}
pub(crate) fn is_well_known_type(full_name: &str) -> bool {
matches!(
full_name,
"google.protobuf.Any"
| "google.protobuf.Timestamp"
| "google.protobuf.Duration"
| "google.protobuf.Struct"
| "google.protobuf.FloatValue"
| "google.protobuf.DoubleValue"
| "google.protobuf.Int32Value"
| "google.protobuf.Int64Value"
| "google.protobuf.UInt32Value"
| "google.protobuf.UInt64Value"
| "google.protobuf.BoolValue"
| "google.protobuf.StringValue"
| "google.protobuf.BytesValue"
| "google.protobuf.FieldMask"
| "google.protobuf.ListValue"
| "google.protobuf.Value"
| "google.protobuf.Empty"
)
}