use crate::error::{Result, SerdeError};
use crate::xml::utils;
use quick_xml::Writer;
use quick_xml::events::{BytesEnd, BytesStart, Event};
use serde::ser::{self, Serialize};
use std::io::Write;
pub fn to_xml_string<T>(value: &T) -> Result<String>
where
T: Serialize + ?Sized,
{
let mut buffer = Vec::new();
to_xml_writer(value, &mut buffer)?;
String::from_utf8(buffer).map_err(|e| SerdeError::Custom(e.to_string()))
}
pub fn to_xml_vec<T>(value: &T) -> Result<Vec<u8>>
where
T: Serialize + ?Sized,
{
let mut buffer = Vec::new();
to_xml_writer(value, &mut buffer)?;
Ok(buffer)
}
pub fn to_xml_writer<T, W>(value: &T, writer: W) -> Result<()>
where
T: Serialize + ?Sized,
W: Write,
{
let mut serializer = XmlSerializer::new(writer);
value.serialize(&mut serializer)?;
serializer.finish()?;
Ok(())
}
#[derive(Debug)]
enum PendingField {
Single(FieldBuffer),
Array(ArrayFieldBuffer),
}
impl PendingField {
fn name(&self) -> &str {
match self {
PendingField::Single(f) => &f.name,
PendingField::Array(a) => &a.name,
}
}
}
#[derive(Debug, Default)]
struct FieldBuffer {
name: String,
value: Option<String>,
id: Option<String>,
extensions: Vec<ExtensionElement>,
}
#[derive(Debug)]
struct ArrayFieldBuffer {
name: String,
values: Vec<Option<String>>,
extension_data: Vec<Option<ArrayExtensionData>>,
}
#[derive(Debug, Clone)]
struct ArrayExtensionData {
id: Option<String>,
extensions: Vec<ExtensionElement>,
}
#[derive(Debug, Clone)]
enum ExtensionValue {
Primitive(String, String),
Complex(String, String),
}
#[derive(Debug, Clone)]
struct ExtensionContent {
id: Option<String>,
value: Option<ExtensionValue>,
extension: Vec<ExtensionElement>,
}
impl ExtensionContent {
fn is_empty(&self) -> bool {
self.id.is_none() && self.value.is_none() && self.extension.is_empty()
}
}
#[derive(Debug, Clone)]
struct ExtensionElement {
url: String,
content: Option<ExtensionContent>,
}
impl FieldBuffer {
fn new(name: String) -> Self {
Self {
name,
value: None,
id: None,
extensions: Vec::new(),
}
}
fn is_empty(&self) -> bool {
self.value.is_none() && self.id.is_none() && self.extensions.is_empty()
}
}
pub struct XmlSerializer<W: Write> {
writer: Writer<W>,
pending_field: Option<PendingField>,
namespace_written: bool,
xml_declaration_written: bool,
open_resource_stack: Vec<String>,
}
impl<W: Write> XmlSerializer<W> {
pub fn new(writer: W) -> Self {
Self {
writer: Writer::new(writer),
pending_field: None,
namespace_written: false,
xml_declaration_written: false,
open_resource_stack: Vec::new(),
}
}
pub fn finish(mut self) -> Result<()> {
if let Some(pending) = self.pending_field.take() {
match pending {
PendingField::Single(field) => self.write_field(field)?,
PendingField::Array(array) => self.write_array_field(array)?,
}
}
while let Some(root_name) = self.open_resource_stack.pop() {
self.write_end_element(&root_name)?;
}
Ok(())
}
fn write_field(&mut self, field: FieldBuffer) -> Result<()> {
if field.is_empty() {
return Ok(());
}
if utils::is_div_element(&field.name) {
return self.write_div_element(&field);
}
let mut element = BytesStart::new(&field.name);
if let Some(id) = &field.id {
element.push_attribute(("id", id.as_str()));
}
if let Some(value) = &field.value {
element.push_attribute(("value", value.as_str()));
}
if field.extensions.is_empty() {
self.writer.write_event(Event::Empty(element))?;
} else {
self.writer.write_event(Event::Start(element))?;
for ext in field.extensions {
self.write_extension(&ext)?;
}
let end = BytesEnd::new(&field.name);
self.writer.write_event(Event::End(end))?;
}
Ok(())
}
fn write_array_field(&mut self, array_field: ArrayFieldBuffer) -> Result<()> {
let max_len = array_field
.values
.len()
.max(array_field.extension_data.len());
for i in 0..max_len {
let value = array_field.values.get(i).and_then(|v| v.as_ref());
let ext_data = array_field.extension_data.get(i).and_then(|e| e.as_ref());
let has_ext_content = ext_data
.map(|e| e.id.is_some() || !e.extensions.is_empty())
.unwrap_or(false);
if value.is_none() && !has_ext_content {
continue;
}
let mut element = BytesStart::new(&array_field.name);
let mut has_attributes = false;
if let Some(ext) = ext_data {
if let Some(id) = &ext.id {
element.push_attribute(("id", id.as_str()));
has_attributes = true;
}
}
if let Some(val) = value {
element.push_attribute(("value", val.as_str()));
has_attributes = true;
}
let has_extensions = ext_data.map(|e| !e.extensions.is_empty()).unwrap_or(false);
if !has_attributes && !has_extensions {
continue;
}
if !has_extensions {
self.writer.write_event(Event::Empty(element))?;
} else {
self.writer.write_event(Event::Start(element))?;
if let Some(ext) = ext_data {
for extension in &ext.extensions {
self.write_extension(extension)?;
}
}
let end = BytesEnd::new(&array_field.name);
self.writer.write_event(Event::End(end))?;
}
}
Ok(())
}
fn write_div_element(&mut self, field: &FieldBuffer) -> Result<()> {
use quick_xml::Reader;
if let Some(xml_content) = &field.value {
let mut reader = Reader::from_str(xml_content);
reader.config_mut().trim_text(false);
loop {
match reader.read_event() {
Ok(Event::Eof) => break,
Ok(event) => {
self.writer.write_event(event)?;
}
Err(e) => {
return Err(SerdeError::Custom(format!(
"Failed to parse XHTML div content: {}",
e
)));
}
}
}
Ok(())
} else {
Ok(())
}
}
fn write_extension(&mut self, ext: &ExtensionElement) -> Result<()> {
let mut ext_element = BytesStart::new("extension");
ext_element.push_attribute(("url", ext.url.as_str()));
if let Some(content) = &ext.content {
if content.is_empty() {
self.writer.write_event(Event::Empty(ext_element))?;
return Ok(());
}
self.writer.write_event(Event::Start(ext_element))?;
if let Some(id) = &content.id {
self.write_simple_element("id", id)?;
}
if let Some(value) = &content.value {
self.write_extension_value(value)?;
}
for nested_ext in &content.extension {
self.write_extension(nested_ext)?;
}
self.writer
.write_event(Event::End(BytesEnd::new("extension")))?;
} else {
self.writer.write_event(Event::Empty(ext_element))?;
}
Ok(())
}
fn write_extension_value(&mut self, ext_value: &ExtensionValue) -> Result<()> {
match ext_value {
ExtensionValue::Primitive(field_name, value) => {
self.write_simple_element(field_name, value)?;
}
ExtensionValue::Complex(field_name, xml_content) => {
self.write_start_element(field_name, false)?;
use quick_xml::Reader;
let mut reader = Reader::from_str(xml_content);
reader.config_mut().trim_text(true);
loop {
match reader.read_event() {
Ok(Event::Eof) => break,
Ok(event) => {
self.writer.write_event(event)?;
}
Err(e) => {
return Err(SerdeError::Custom(format!(
"Failed to parse complex extension value XML: {}",
e
)));
}
}
}
self.writer
.write_event(Event::End(BytesEnd::new(field_name)))?;
}
}
Ok(())
}
fn write_simple_element(&mut self, name: &str, value: &str) -> Result<()> {
let mut element = BytesStart::new(name);
element.push_attribute(("value", value));
self.writer.write_event(Event::Empty(element))?;
Ok(())
}
fn write_xml_declaration(&mut self) -> Result<()> {
if !self.xml_declaration_written {
self.writer
.write_event(Event::Decl(quick_xml::events::BytesDecl::new(
"1.0",
Some("UTF-8"),
None,
)))?;
self.xml_declaration_written = true;
}
Ok(())
}
fn write_start_element(&mut self, name: &str, add_namespace: bool) -> Result<()> {
if !self.xml_declaration_written {
self.write_xml_declaration()?;
}
let mut element = BytesStart::new(name);
if add_namespace && !self.namespace_written {
element.push_attribute(("xmlns", utils::FHIR_NAMESPACE));
self.namespace_written = true;
}
self.writer.write_event(Event::Start(element))?;
Ok(())
}
fn write_end_element(&mut self, name: &str) -> Result<()> {
let end = BytesEnd::new(name);
self.writer.write_event(Event::End(end))?;
Ok(())
}
fn start_resource_element(&mut self, name: &str) -> Result<()> {
let add_namespace = self.open_resource_stack.is_empty();
self.write_start_element(name, add_namespace)?;
self.open_resource_stack.push(name.to_string());
Ok(())
}
fn end_resource_element(&mut self) -> Result<()> {
if let Some(name) = self.open_resource_stack.pop() {
self.write_end_element(&name)?;
}
Ok(())
}
}
impl<'a, W: Write> ser::Serializer for &'a mut XmlSerializer<W> {
type Ok = ();
type Error = SerdeError;
type SerializeSeq = SeqSerializer<'a, W>;
type SerializeTuple = Self;
type SerializeTupleStruct = Self;
type SerializeTupleVariant = Self;
type SerializeMap = MapSerializer<'a, W>;
type SerializeStruct = MapSerializer<'a, W>;
type SerializeStructVariant = Self;
fn serialize_bool(self, v: bool) -> Result<()> {
self.serialize_str(utils::bool_to_string(v))
}
fn serialize_i8(self, v: i8) -> Result<()> {
self.serialize_i64(i64::from(v))
}
fn serialize_i16(self, v: i16) -> Result<()> {
self.serialize_i64(i64::from(v))
}
fn serialize_i32(self, v: i32) -> Result<()> {
self.serialize_i64(i64::from(v))
}
fn serialize_i64(self, v: i64) -> Result<()> {
self.serialize_str(&v.to_string())
}
fn serialize_u8(self, v: u8) -> Result<()> {
self.serialize_u64(u64::from(v))
}
fn serialize_u16(self, v: u16) -> Result<()> {
self.serialize_u64(u64::from(v))
}
fn serialize_u32(self, v: u32) -> Result<()> {
self.serialize_u64(u64::from(v))
}
fn serialize_u64(self, v: u64) -> Result<()> {
self.serialize_str(&v.to_string())
}
fn serialize_f32(self, v: f32) -> Result<()> {
self.serialize_f64(f64::from(v))
}
fn serialize_f64(self, v: f64) -> Result<()> {
self.serialize_str(&v.to_string())
}
fn serialize_char(self, v: char) -> Result<()> {
self.serialize_str(&v.to_string())
}
fn serialize_str(self, _v: &str) -> Result<()> {
Err(SerdeError::Custom(
"Direct string serialization not supported - strings should be wrapped in fields"
.to_string(),
))
}
fn serialize_bytes(self, _v: &[u8]) -> Result<()> {
Err(SerdeError::Custom(
"Bytes not supported in FHIR XML".to_string(),
))
}
fn serialize_none(self) -> Result<()> {
Ok(())
}
fn serialize_some<T>(self, value: &T) -> Result<()>
where
T: ?Sized + Serialize,
{
value.serialize(self)
}
fn serialize_unit(self) -> Result<()> {
Ok(())
}
fn serialize_unit_struct(self, _name: &'static str) -> Result<()> {
Ok(())
}
fn serialize_unit_variant(
self,
_name: &'static str,
_variant_index: u32,
variant: &'static str,
) -> Result<()> {
self.serialize_str(variant)
}
fn serialize_newtype_struct<T>(self, _name: &'static str, value: &T) -> Result<()>
where
T: ?Sized + Serialize,
{
value.serialize(self)
}
fn serialize_newtype_variant<T>(
self,
_name: &'static str,
_variant_index: u32,
_variant: &'static str,
value: &T,
) -> Result<()>
where
T: ?Sized + Serialize,
{
value.serialize(self)
}
fn serialize_seq(self, _len: Option<usize>) -> Result<Self::SerializeSeq> {
Ok(SeqSerializer { serializer: self })
}
fn serialize_tuple(self, _len: usize) -> Result<Self::SerializeTuple> {
Ok(self)
}
fn serialize_tuple_struct(
self,
_name: &'static str,
_len: usize,
) -> Result<Self::SerializeTupleStruct> {
Ok(self)
}
fn serialize_tuple_variant(
self,
_name: &'static str,
_variant_index: u32,
_variant: &'static str,
_len: usize,
) -> Result<Self::SerializeTupleVariant> {
Ok(self)
}
fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap> {
Ok(MapSerializer {
serializer: self,
current_key: None,
resource_element_open: false,
})
}
fn serialize_struct(self, _name: &'static str, _len: usize) -> Result<Self::SerializeStruct> {
Ok(MapSerializer {
serializer: self,
current_key: None,
resource_element_open: false,
})
}
fn serialize_struct_variant(
self,
_name: &'static str,
_variant_index: u32,
_variant: &'static str,
_len: usize,
) -> Result<Self::SerializeStructVariant> {
Ok(self)
}
}
pub struct SeqSerializer<'a, W: Write> {
serializer: &'a mut XmlSerializer<W>,
}
impl<'a, W: Write> ser::SerializeSeq for SeqSerializer<'a, W> {
type Ok = ();
type Error = SerdeError;
fn serialize_element<T>(&mut self, value: &T) -> Result<()>
where
T: ?Sized + Serialize,
{
value.serialize(&mut *self.serializer)
}
fn end(self) -> Result<()> {
Ok(())
}
}
struct NamedSeqSerializer<'a, W: Write> {
serializer: &'a mut XmlSerializer<W>,
element_name: String,
}
impl<'a, W: Write> ser::Serializer for &'a mut NamedSeqSerializer<'a, W> {
type Ok = ();
type Error = SerdeError;
type SerializeSeq = NamedSeqElements<'a, 'a, W>;
type SerializeTuple = ser::Impossible<(), SerdeError>;
type SerializeTupleStruct = ser::Impossible<(), SerdeError>;
type SerializeTupleVariant = ser::Impossible<(), SerdeError>;
type SerializeMap = ser::Impossible<(), SerdeError>;
type SerializeStruct = ser::Impossible<(), SerdeError>;
type SerializeStructVariant = ser::Impossible<(), SerdeError>;
fn serialize_bool(self, _v: bool) -> Result<()> {
Err(SerdeError::Custom("Expected sequence".to_string()))
}
fn serialize_i8(self, _v: i8) -> Result<()> {
Err(SerdeError::Custom("Expected sequence".to_string()))
}
fn serialize_i16(self, _v: i16) -> Result<()> {
Err(SerdeError::Custom("Expected sequence".to_string()))
}
fn serialize_i32(self, _v: i32) -> Result<()> {
Err(SerdeError::Custom("Expected sequence".to_string()))
}
fn serialize_i64(self, _v: i64) -> Result<()> {
Err(SerdeError::Custom("Expected sequence".to_string()))
}
fn serialize_u8(self, _v: u8) -> Result<()> {
Err(SerdeError::Custom("Expected sequence".to_string()))
}
fn serialize_u16(self, _v: u16) -> Result<()> {
Err(SerdeError::Custom("Expected sequence".to_string()))
}
fn serialize_u32(self, _v: u32) -> Result<()> {
Err(SerdeError::Custom("Expected sequence".to_string()))
}
fn serialize_u64(self, _v: u64) -> Result<()> {
Err(SerdeError::Custom("Expected sequence".to_string()))
}
fn serialize_f32(self, _v: f32) -> Result<()> {
Err(SerdeError::Custom("Expected sequence".to_string()))
}
fn serialize_f64(self, _v: f64) -> Result<()> {
Err(SerdeError::Custom("Expected sequence".to_string()))
}
fn serialize_char(self, _v: char) -> Result<()> {
Err(SerdeError::Custom("Expected sequence".to_string()))
}
fn serialize_str(self, _v: &str) -> Result<()> {
Err(SerdeError::Custom("Expected sequence".to_string()))
}
fn serialize_bytes(self, _v: &[u8]) -> Result<()> {
Err(SerdeError::Custom("Expected sequence".to_string()))
}
fn serialize_none(self) -> Result<()> {
Ok(())
}
fn serialize_some<T: ?Sized + Serialize>(self, value: &T) -> Result<()> {
value.serialize(self)
}
fn serialize_unit(self) -> Result<()> {
Err(SerdeError::Custom("Expected sequence".to_string()))
}
fn serialize_unit_struct(self, _name: &'static str) -> Result<()> {
Err(SerdeError::Custom("Expected sequence".to_string()))
}
fn serialize_unit_variant(
self,
_name: &'static str,
_variant_index: u32,
_variant: &'static str,
) -> Result<()> {
Err(SerdeError::Custom("Expected sequence".to_string()))
}
fn serialize_newtype_struct<T: ?Sized + Serialize>(
self,
_name: &'static str,
value: &T,
) -> Result<()> {
value.serialize(self)
}
fn serialize_newtype_variant<T: ?Sized + Serialize>(
self,
_name: &'static str,
_variant_index: u32,
_variant: &'static str,
value: &T,
) -> Result<()> {
value.serialize(self)
}
fn serialize_seq(self, _len: Option<usize>) -> Result<Self::SerializeSeq> {
Ok(NamedSeqElements { parent: self })
}
fn serialize_tuple(self, _len: usize) -> Result<Self::SerializeTuple> {
Err(SerdeError::Custom("Tuples not supported".to_string()))
}
fn serialize_tuple_struct(
self,
_name: &'static str,
_len: usize,
) -> Result<Self::SerializeTupleStruct> {
Err(SerdeError::Custom(
"Tuple structs not supported".to_string(),
))
}
fn serialize_tuple_variant(
self,
_name: &'static str,
_variant_index: u32,
_variant: &'static str,
_len: usize,
) -> Result<Self::SerializeTupleVariant> {
Err(SerdeError::Custom(
"Tuple variants not supported".to_string(),
))
}
fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap> {
Err(SerdeError::Custom(
"Maps not supported in sequences".to_string(),
))
}
fn serialize_struct(self, _name: &'static str, _len: usize) -> Result<Self::SerializeStruct> {
Err(SerdeError::Custom(
"Structs not supported in sequences".to_string(),
))
}
fn serialize_struct_variant(
self,
_name: &'static str,
_variant_index: u32,
_variant: &'static str,
_len: usize,
) -> Result<Self::SerializeStructVariant> {
Err(SerdeError::Custom(
"Struct variants not supported".to_string(),
))
}
}
struct NamedSeqElements<'a, 'b, W: Write> {
parent: &'a mut NamedSeqSerializer<'b, W>,
}
impl<'a, 'b, W: Write> ser::SerializeSeq for NamedSeqElements<'a, 'b, W> {
type Ok = ();
type Error = SerdeError;
fn serialize_element<T>(&mut self, value: &T) -> Result<()>
where
T: ?Sized + Serialize,
{
if is_none_value(value)? {
return Ok(());
}
if let Some(val_str) = try_serialize_as_primitive(value)? {
self.parent
.serializer
.write_simple_element(&self.parent.element_name, &val_str)?;
} else {
self.parent
.serializer
.write_start_element(&self.parent.element_name, false)?;
value.serialize(&mut *self.parent.serializer)?;
self.parent
.serializer
.write_end_element(&self.parent.element_name)?;
}
Ok(())
}
fn end(self) -> Result<()> {
Ok(())
}
}
fn extract_extensions<T: ?Sized + Serialize>(value: &T) -> Result<Vec<ExtensionElement>> {
struct ExtensionArrayExtractor {
extensions: Vec<ExtensionElement>,
}
impl<'a> ser::Serializer for &'a mut ExtensionArrayExtractor {
type Ok = ();
type Error = SerdeError;
type SerializeSeq = ExtensionSeqExtractor<'a>;
type SerializeTuple = ser::Impossible<(), SerdeError>;
type SerializeTupleStruct = ser::Impossible<(), SerdeError>;
type SerializeTupleVariant = ser::Impossible<(), SerdeError>;
type SerializeMap = ser::Impossible<(), SerdeError>;
type SerializeStruct = ser::Impossible<(), SerdeError>;
type SerializeStructVariant = ser::Impossible<(), SerdeError>;
fn serialize_bool(self, _v: bool) -> Result<()> {
Ok(())
}
fn serialize_i8(self, _v: i8) -> Result<()> {
Ok(())
}
fn serialize_i16(self, _v: i16) -> Result<()> {
Ok(())
}
fn serialize_i32(self, _v: i32) -> Result<()> {
Ok(())
}
fn serialize_i64(self, _v: i64) -> Result<()> {
Ok(())
}
fn serialize_u8(self, _v: u8) -> Result<()> {
Ok(())
}
fn serialize_u16(self, _v: u16) -> Result<()> {
Ok(())
}
fn serialize_u32(self, _v: u32) -> Result<()> {
Ok(())
}
fn serialize_u64(self, _v: u64) -> Result<()> {
Ok(())
}
fn serialize_f32(self, _v: f32) -> Result<()> {
Ok(())
}
fn serialize_f64(self, _v: f64) -> Result<()> {
Ok(())
}
fn serialize_char(self, _v: char) -> Result<()> {
Ok(())
}
fn serialize_str(self, _v: &str) -> Result<()> {
Ok(())
}
fn serialize_bytes(self, _v: &[u8]) -> Result<()> {
Ok(())
}
fn serialize_none(self) -> Result<()> {
Ok(())
}
fn serialize_some<T: ?Sized + Serialize>(self, value: &T) -> Result<()> {
value.serialize(self)
}
fn serialize_unit(self) -> Result<()> {
Ok(())
}
fn serialize_unit_struct(self, _name: &'static str) -> Result<()> {
Ok(())
}
fn serialize_unit_variant(
self,
_name: &'static str,
_variant_index: u32,
_variant: &'static str,
) -> Result<()> {
Ok(())
}
fn serialize_newtype_struct<T: ?Sized + Serialize>(
self,
_name: &'static str,
value: &T,
) -> Result<()> {
value.serialize(self)
}
fn serialize_newtype_variant<T: ?Sized + Serialize>(
self,
_name: &'static str,
_variant_index: u32,
_variant: &'static str,
_value: &T,
) -> Result<()> {
Ok(())
}
fn serialize_seq(self, _len: Option<usize>) -> Result<Self::SerializeSeq> {
Ok(ExtensionSeqExtractor { parent: self })
}
fn serialize_tuple(self, _len: usize) -> Result<Self::SerializeTuple> {
Err(SerdeError::Custom("Unexpected tuple".to_string()))
}
fn serialize_tuple_struct(
self,
_name: &'static str,
_len: usize,
) -> Result<Self::SerializeTupleStruct> {
Err(SerdeError::Custom("Unexpected tuple struct".to_string()))
}
fn serialize_tuple_variant(
self,
_name: &'static str,
_variant_index: u32,
_variant: &'static str,
_len: usize,
) -> Result<Self::SerializeTupleVariant> {
Err(SerdeError::Custom("Unexpected tuple variant".to_string()))
}
fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap> {
Err(SerdeError::Custom("Unexpected map".to_string()))
}
fn serialize_struct(
self,
_name: &'static str,
_len: usize,
) -> Result<Self::SerializeStruct> {
Err(SerdeError::Custom("Unexpected struct".to_string()))
}
fn serialize_struct_variant(
self,
_name: &'static str,
_variant_index: u32,
_variant: &'static str,
_len: usize,
) -> Result<Self::SerializeStructVariant> {
Err(SerdeError::Custom("Unexpected struct variant".to_string()))
}
}
struct ExtensionSeqExtractor<'a> {
parent: &'a mut ExtensionArrayExtractor,
}
impl<'a> ser::SerializeSeq for ExtensionSeqExtractor<'a> {
type Ok = ();
type Error = SerdeError;
fn serialize_element<T: ?Sized + Serialize>(&mut self, value: &T) -> Result<()> {
let ext = extract_single_extension(value)?;
if let Some(ext) = ext {
self.parent.extensions.push(ext);
}
Ok(())
}
fn end(self) -> Result<()> {
Ok(())
}
}
let mut extractor = ExtensionArrayExtractor {
extensions: Vec::new(),
};
value.serialize(&mut extractor)?;
Ok(extractor.extensions)
}
fn extract_single_extension<T: ?Sized + Serialize>(value: &T) -> Result<Option<ExtensionElement>> {
#[derive(Default)]
struct SingleExtensionExtractor {
url: Option<String>,
id: Option<String>,
value: Option<ExtensionValue>,
nested_extensions: Vec<ExtensionElement>,
current_key: Option<String>,
}
impl<'a> ser::Serializer for &'a mut SingleExtensionExtractor {
type Ok = ();
type Error = SerdeError;
type SerializeSeq = ser::Impossible<(), SerdeError>;
type SerializeTuple = ser::Impossible<(), SerdeError>;
type SerializeTupleStruct = ser::Impossible<(), SerdeError>;
type SerializeTupleVariant = ser::Impossible<(), SerdeError>;
type SerializeMap = SingleExtensionMapExtractor<'a>;
type SerializeStruct = SingleExtensionMapExtractor<'a>;
type SerializeStructVariant = ser::Impossible<(), SerdeError>;
fn serialize_bool(self, _v: bool) -> Result<()> {
Ok(())
}
fn serialize_i8(self, _v: i8) -> Result<()> {
Ok(())
}
fn serialize_i16(self, _v: i16) -> Result<()> {
Ok(())
}
fn serialize_i32(self, _v: i32) -> Result<()> {
Ok(())
}
fn serialize_i64(self, _v: i64) -> Result<()> {
Ok(())
}
fn serialize_u8(self, _v: u8) -> Result<()> {
Ok(())
}
fn serialize_u16(self, _v: u16) -> Result<()> {
Ok(())
}
fn serialize_u32(self, _v: u32) -> Result<()> {
Ok(())
}
fn serialize_u64(self, _v: u64) -> Result<()> {
Ok(())
}
fn serialize_f32(self, _v: f32) -> Result<()> {
Ok(())
}
fn serialize_f64(self, _v: f64) -> Result<()> {
Ok(())
}
fn serialize_char(self, _v: char) -> Result<()> {
Ok(())
}
fn serialize_str(self, _v: &str) -> Result<()> {
Ok(())
}
fn serialize_bytes(self, _v: &[u8]) -> Result<()> {
Ok(())
}
fn serialize_none(self) -> Result<()> {
Ok(())
}
fn serialize_some<T: ?Sized + Serialize>(self, value: &T) -> Result<()> {
value.serialize(self)
}
fn serialize_unit(self) -> Result<()> {
Ok(())
}
fn serialize_unit_struct(self, _name: &'static str) -> Result<()> {
Ok(())
}
fn serialize_unit_variant(
self,
_name: &'static str,
_variant_index: u32,
_variant: &'static str,
) -> Result<()> {
Ok(())
}
fn serialize_newtype_struct<T: ?Sized + Serialize>(
self,
_name: &'static str,
value: &T,
) -> Result<()> {
value.serialize(self)
}
fn serialize_newtype_variant<T: ?Sized + Serialize>(
self,
_name: &'static str,
_variant_index: u32,
_variant: &'static str,
_value: &T,
) -> Result<()> {
Ok(())
}
fn serialize_seq(self, _len: Option<usize>) -> Result<Self::SerializeSeq> {
Err(SerdeError::Custom("Unexpected seq".to_string()))
}
fn serialize_tuple(self, _len: usize) -> Result<Self::SerializeTuple> {
Err(SerdeError::Custom("Unexpected tuple".to_string()))
}
fn serialize_tuple_struct(
self,
_name: &'static str,
_len: usize,
) -> Result<Self::SerializeTupleStruct> {
Err(SerdeError::Custom("Unexpected tuple struct".to_string()))
}
fn serialize_tuple_variant(
self,
_name: &'static str,
_variant_index: u32,
_variant: &'static str,
_len: usize,
) -> Result<Self::SerializeTupleVariant> {
Err(SerdeError::Custom("Unexpected tuple variant".to_string()))
}
fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap> {
Ok(SingleExtensionMapExtractor { parent: self })
}
fn serialize_struct(
self,
_name: &'static str,
_len: usize,
) -> Result<Self::SerializeStruct> {
Ok(SingleExtensionMapExtractor { parent: self })
}
fn serialize_struct_variant(
self,
_name: &'static str,
_variant_index: u32,
_variant: &'static str,
_len: usize,
) -> Result<Self::SerializeStructVariant> {
Err(SerdeError::Custom("Unexpected struct variant".to_string()))
}
}
struct SingleExtensionMapExtractor<'a> {
parent: &'a mut SingleExtensionExtractor,
}
impl<'a> ser::SerializeStruct for SingleExtensionMapExtractor<'a> {
type Ok = ();
type Error = SerdeError;
fn serialize_field<T: ?Sized + Serialize>(
&mut self,
key: &'static str,
value: &T,
) -> Result<()> {
self.parent.current_key = Some(key.to_string());
if key == "url" {
let mut url_extractor = StringExtractor { value: None };
value.serialize(&mut url_extractor)?;
self.parent.url = url_extractor.value;
} else if key == "id" {
let mut id_extractor = StringExtractor { value: None };
value.serialize(&mut id_extractor)?;
self.parent.id = id_extractor.value;
} else if key.starts_with("value") && key != "value" {
self.parent.value = extract_extension_value(key, value)?;
} else if key == "extension" {
self.parent.nested_extensions = extract_extensions(value)?;
}
self.parent.current_key = None;
Ok(())
}
fn end(self) -> Result<()> {
Ok(())
}
}
impl<'a> ser::SerializeMap for SingleExtensionMapExtractor<'a> {
type Ok = ();
type Error = SerdeError;
fn serialize_key<T: ?Sized + Serialize>(&mut self, key: &T) -> Result<()> {
let mut key_extractor = StringExtractor { value: None };
key.serialize(&mut key_extractor)?;
self.parent.current_key = key_extractor.value;
Ok(())
}
fn serialize_value<T: ?Sized + Serialize>(&mut self, value: &T) -> Result<()> {
if let Some(ref key) = self.parent.current_key {
if key == "url" {
let mut url_extractor = StringExtractor { value: None };
value.serialize(&mut url_extractor)?;
self.parent.url = url_extractor.value;
} else if key == "id" {
let mut id_extractor = StringExtractor { value: None };
value.serialize(&mut id_extractor)?;
self.parent.id = id_extractor.value;
} else if key.starts_with("value") && key != "value" {
self.parent.value = extract_extension_value(key, value)?;
} else if key == "extension" {
self.parent.nested_extensions = extract_extensions(value)?;
}
}
self.parent.current_key = None;
Ok(())
}
fn end(self) -> Result<()> {
Ok(())
}
}
let mut extractor = SingleExtensionExtractor::default();
value.serialize(&mut extractor)?;
if let Some(url) = extractor.url {
let content = if extractor.id.is_none()
&& extractor.value.is_none()
&& extractor.nested_extensions.is_empty()
{
None
} else {
Some(ExtensionContent {
id: extractor.id,
value: extractor.value,
extension: extractor.nested_extensions,
})
};
Ok(Some(ExtensionElement { url, content }))
} else {
Ok(None)
}
}
fn extract_extension_value<T: ?Sized + Serialize>(
field_name: &str,
value: &T,
) -> Result<Option<ExtensionValue>> {
let mut primitive_extractor = PrimitiveValueExtractor { value: None };
let _ = value.serialize(&mut primitive_extractor);
if let Some(primitive_value) = primitive_extractor.value {
Ok(Some(ExtensionValue::Primitive(
field_name.to_string(),
primitive_value,
)))
} else {
let xml = to_xml_string(value)?;
let content = xml
.lines()
.skip(1) .collect::<Vec<_>>()
.join("\n");
Ok(Some(ExtensionValue::Complex(
field_name.to_string(),
content,
)))
}
}
struct PrimitiveValueExtractor {
value: Option<String>,
}
impl ser::Serializer for &mut PrimitiveValueExtractor {
type Ok = ();
type Error = SerdeError;
type SerializeSeq = ser::Impossible<(), SerdeError>;
type SerializeTuple = ser::Impossible<(), SerdeError>;
type SerializeTupleStruct = ser::Impossible<(), SerdeError>;
type SerializeTupleVariant = ser::Impossible<(), SerdeError>;
type SerializeMap = ser::Impossible<(), SerdeError>;
type SerializeStruct = ser::Impossible<(), SerdeError>;
type SerializeStructVariant = ser::Impossible<(), SerdeError>;
fn serialize_bool(self, v: bool) -> Result<()> {
self.value = Some(if v { "true" } else { "false" }.to_string());
Ok(())
}
fn serialize_i8(self, v: i8) -> Result<()> {
self.value = Some(v.to_string());
Ok(())
}
fn serialize_i16(self, v: i16) -> Result<()> {
self.value = Some(v.to_string());
Ok(())
}
fn serialize_i32(self, v: i32) -> Result<()> {
self.value = Some(v.to_string());
Ok(())
}
fn serialize_i64(self, v: i64) -> Result<()> {
self.value = Some(v.to_string());
Ok(())
}
fn serialize_u8(self, v: u8) -> Result<()> {
self.value = Some(v.to_string());
Ok(())
}
fn serialize_u16(self, v: u16) -> Result<()> {
self.value = Some(v.to_string());
Ok(())
}
fn serialize_u32(self, v: u32) -> Result<()> {
self.value = Some(v.to_string());
Ok(())
}
fn serialize_u64(self, v: u64) -> Result<()> {
self.value = Some(v.to_string());
Ok(())
}
fn serialize_f32(self, v: f32) -> Result<()> {
self.value = Some(v.to_string());
Ok(())
}
fn serialize_f64(self, v: f64) -> Result<()> {
self.value = Some(v.to_string());
Ok(())
}
fn serialize_char(self, v: char) -> Result<()> {
self.value = Some(v.to_string());
Ok(())
}
fn serialize_str(self, v: &str) -> Result<()> {
self.value = Some(v.to_string());
Ok(())
}
fn serialize_bytes(self, _v: &[u8]) -> Result<()> {
Err(SerdeError::Custom("Bytes not supported".to_string()))
}
fn serialize_none(self) -> Result<()> {
Ok(())
}
fn serialize_some<T: ?Sized + Serialize>(self, value: &T) -> Result<()> {
value.serialize(self)
}
fn serialize_unit(self) -> Result<()> {
Ok(())
}
fn serialize_unit_struct(self, _name: &'static str) -> Result<()> {
Ok(())
}
fn serialize_unit_variant(
self,
_name: &'static str,
_variant_index: u32,
_variant: &'static str,
) -> Result<()> {
Ok(())
}
fn serialize_newtype_struct<T: ?Sized + Serialize>(
self,
_name: &'static str,
value: &T,
) -> Result<()> {
value.serialize(self)
}
fn serialize_newtype_variant<T: ?Sized + Serialize>(
self,
_name: &'static str,
_variant_index: u32,
_variant: &'static str,
_value: &T,
) -> Result<()> {
Ok(())
}
fn serialize_seq(self, _len: Option<usize>) -> Result<Self::SerializeSeq> {
Err(SerdeError::Custom("Not a primitive value".to_string()))
}
fn serialize_tuple(self, _len: usize) -> Result<Self::SerializeTuple> {
Err(SerdeError::Custom("Not a primitive value".to_string()))
}
fn serialize_tuple_struct(
self,
_name: &'static str,
_len: usize,
) -> Result<Self::SerializeTupleStruct> {
Err(SerdeError::Custom("Not a primitive value".to_string()))
}
fn serialize_tuple_variant(
self,
_name: &'static str,
_variant_index: u32,
_variant: &'static str,
_len: usize,
) -> Result<Self::SerializeTupleVariant> {
Err(SerdeError::Custom("Not a primitive value".to_string()))
}
fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap> {
Err(SerdeError::Custom("Not a primitive value".to_string()))
}
fn serialize_struct(self, _name: &'static str, _len: usize) -> Result<Self::SerializeStruct> {
Err(SerdeError::Custom("Not a primitive value".to_string()))
}
fn serialize_struct_variant(
self,
_name: &'static str,
_variant_index: u32,
_variant: &'static str,
_len: usize,
) -> Result<Self::SerializeStructVariant> {
Err(SerdeError::Custom("Not a primitive value".to_string()))
}
}
struct StringExtractor {
value: Option<String>,
}
impl ser::Serializer for &mut StringExtractor {
type Ok = ();
type Error = SerdeError;
type SerializeSeq = ser::Impossible<(), SerdeError>;
type SerializeTuple = ser::Impossible<(), SerdeError>;
type SerializeTupleStruct = ser::Impossible<(), SerdeError>;
type SerializeTupleVariant = ser::Impossible<(), SerdeError>;
type SerializeMap = ser::Impossible<(), SerdeError>;
type SerializeStruct = ser::Impossible<(), SerdeError>;
type SerializeStructVariant = ser::Impossible<(), SerdeError>;
fn serialize_bool(self, _v: bool) -> Result<()> {
Ok(())
}
fn serialize_i8(self, _v: i8) -> Result<()> {
Ok(())
}
fn serialize_i16(self, _v: i16) -> Result<()> {
Ok(())
}
fn serialize_i32(self, _v: i32) -> Result<()> {
Ok(())
}
fn serialize_i64(self, _v: i64) -> Result<()> {
Ok(())
}
fn serialize_u8(self, _v: u8) -> Result<()> {
Ok(())
}
fn serialize_u16(self, _v: u16) -> Result<()> {
Ok(())
}
fn serialize_u32(self, _v: u32) -> Result<()> {
Ok(())
}
fn serialize_u64(self, _v: u64) -> Result<()> {
Ok(())
}
fn serialize_f32(self, _v: f32) -> Result<()> {
Ok(())
}
fn serialize_f64(self, _v: f64) -> Result<()> {
Ok(())
}
fn serialize_char(self, _v: char) -> Result<()> {
Ok(())
}
fn serialize_str(self, v: &str) -> Result<()> {
self.value = Some(v.to_string());
Ok(())
}
fn serialize_bytes(self, _v: &[u8]) -> Result<()> {
Ok(())
}
fn serialize_none(self) -> Result<()> {
Ok(())
}
fn serialize_some<T: ?Sized + Serialize>(self, value: &T) -> Result<()> {
value.serialize(self)
}
fn serialize_unit(self) -> Result<()> {
Ok(())
}
fn serialize_unit_struct(self, _name: &'static str) -> Result<()> {
Ok(())
}
fn serialize_unit_variant(
self,
_name: &'static str,
_variant_index: u32,
_variant: &'static str,
) -> Result<()> {
Ok(())
}
fn serialize_newtype_struct<T: ?Sized + Serialize>(
self,
_name: &'static str,
value: &T,
) -> Result<()> {
value.serialize(self)
}
fn serialize_newtype_variant<T: ?Sized + Serialize>(
self,
_name: &'static str,
_variant_index: u32,
_variant: &'static str,
_value: &T,
) -> Result<()> {
Ok(())
}
fn serialize_seq(self, _len: Option<usize>) -> Result<Self::SerializeSeq> {
Err(SerdeError::Custom("Expected string".to_string()))
}
fn serialize_tuple(self, _len: usize) -> Result<Self::SerializeTuple> {
Err(SerdeError::Custom("Expected string".to_string()))
}
fn serialize_tuple_struct(
self,
_name: &'static str,
_len: usize,
) -> Result<Self::SerializeTupleStruct> {
Err(SerdeError::Custom("Expected string".to_string()))
}
fn serialize_tuple_variant(
self,
_name: &'static str,
_variant_index: u32,
_variant: &'static str,
_len: usize,
) -> Result<Self::SerializeTupleVariant> {
Err(SerdeError::Custom("Expected string".to_string()))
}
fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap> {
Err(SerdeError::Custom("Expected string".to_string()))
}
fn serialize_struct(self, _name: &'static str, _len: usize) -> Result<Self::SerializeStruct> {
Err(SerdeError::Custom("Expected string".to_string()))
}
fn serialize_struct_variant(
self,
_name: &'static str,
_variant_index: u32,
_variant: &'static str,
_len: usize,
) -> Result<Self::SerializeStructVariant> {
Err(SerdeError::Custom("Expected string".to_string()))
}
}
fn extract_extension_fields<T: ?Sized + Serialize>(
value: &T,
) -> Result<(Option<String>, Vec<ExtensionElement>)> {
#[derive(Default)]
struct ExtensionFieldExtractor {
id: Option<String>,
extensions: Vec<ExtensionElement>,
current_key: Option<String>,
}
impl<'a> ser::Serializer for &'a mut ExtensionFieldExtractor {
type Ok = ();
type Error = SerdeError;
type SerializeSeq = ser::Impossible<(), SerdeError>;
type SerializeTuple = ser::Impossible<(), SerdeError>;
type SerializeTupleStruct = ser::Impossible<(), SerdeError>;
type SerializeTupleVariant = ser::Impossible<(), SerdeError>;
type SerializeMap = ExtensionFieldMapSerializer<'a>;
type SerializeStruct = ExtensionFieldMapSerializer<'a>;
type SerializeStructVariant = ser::Impossible<(), SerdeError>;
fn serialize_bool(self, _v: bool) -> Result<()> {
Ok(())
}
fn serialize_i8(self, _v: i8) -> Result<()> {
Ok(())
}
fn serialize_i16(self, _v: i16) -> Result<()> {
Ok(())
}
fn serialize_i32(self, _v: i32) -> Result<()> {
Ok(())
}
fn serialize_i64(self, _v: i64) -> Result<()> {
Ok(())
}
fn serialize_u8(self, _v: u8) -> Result<()> {
Ok(())
}
fn serialize_u16(self, _v: u16) -> Result<()> {
Ok(())
}
fn serialize_u32(self, _v: u32) -> Result<()> {
Ok(())
}
fn serialize_u64(self, _v: u64) -> Result<()> {
Ok(())
}
fn serialize_f32(self, _v: f32) -> Result<()> {
Ok(())
}
fn serialize_f64(self, _v: f64) -> Result<()> {
Ok(())
}
fn serialize_char(self, _v: char) -> Result<()> {
Ok(())
}
fn serialize_str(self, _v: &str) -> Result<()> {
Ok(())
}
fn serialize_bytes(self, _v: &[u8]) -> Result<()> {
Ok(())
}
fn serialize_none(self) -> Result<()> {
Ok(())
}
fn serialize_some<T: ?Sized + Serialize>(self, value: &T) -> Result<()> {
value.serialize(self)
}
fn serialize_unit(self) -> Result<()> {
Ok(())
}
fn serialize_unit_struct(self, _name: &'static str) -> Result<()> {
Ok(())
}
fn serialize_unit_variant(
self,
_name: &'static str,
_variant_index: u32,
_variant: &'static str,
) -> Result<()> {
Ok(())
}
fn serialize_newtype_struct<T: ?Sized + Serialize>(
self,
_name: &'static str,
value: &T,
) -> Result<()> {
value.serialize(self)
}
fn serialize_newtype_variant<T: ?Sized + Serialize>(
self,
_name: &'static str,
_variant_index: u32,
_variant: &'static str,
value: &T,
) -> Result<()> {
value.serialize(self)
}
fn serialize_seq(self, _len: Option<usize>) -> Result<Self::SerializeSeq> {
Err(SerdeError::Custom("Unexpected sequence".to_string()))
}
fn serialize_tuple(self, _len: usize) -> Result<Self::SerializeTuple> {
Err(SerdeError::Custom("Unexpected tuple".to_string()))
}
fn serialize_tuple_struct(
self,
_name: &'static str,
_len: usize,
) -> Result<Self::SerializeTupleStruct> {
Err(SerdeError::Custom("Unexpected tuple struct".to_string()))
}
fn serialize_tuple_variant(
self,
_name: &'static str,
_variant_index: u32,
_variant: &'static str,
_len: usize,
) -> Result<Self::SerializeTupleVariant> {
Err(SerdeError::Custom("Unexpected tuple variant".to_string()))
}
fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap> {
Ok(ExtensionFieldMapSerializer { extractor: self })
}
fn serialize_struct(
self,
_name: &'static str,
_len: usize,
) -> Result<Self::SerializeStruct> {
Ok(ExtensionFieldMapSerializer { extractor: self })
}
fn serialize_struct_variant(
self,
_name: &'static str,
_variant_index: u32,
_variant: &'static str,
_len: usize,
) -> Result<Self::SerializeStructVariant> {
Err(SerdeError::Custom("Unexpected struct variant".to_string()))
}
}
struct ExtensionFieldMapSerializer<'a> {
extractor: &'a mut ExtensionFieldExtractor,
}
impl<'a> ser::SerializeMap for ExtensionFieldMapSerializer<'a> {
type Ok = ();
type Error = SerdeError;
fn serialize_key<T: ?Sized + Serialize>(&mut self, key: &T) -> Result<()> {
if let Some(key_str) = try_serialize_as_primitive(key)? {
self.extractor.current_key = Some(key_str);
}
Ok(())
}
fn serialize_value<T: ?Sized + Serialize>(&mut self, value: &T) -> Result<()> {
if let Some(key) = self.extractor.current_key.take() {
if key == "id" {
if let Some(id_str) = try_serialize_as_primitive(value)? {
self.extractor.id = Some(id_str);
}
} else if key == "extension" {
self.extractor.extensions = extract_extensions(value)?;
}
}
Ok(())
}
fn end(self) -> Result<()> {
Ok(())
}
}
impl<'a> ser::SerializeStruct for ExtensionFieldMapSerializer<'a> {
type Ok = ();
type Error = SerdeError;
fn serialize_field<T: ?Sized + Serialize>(
&mut self,
key: &'static str,
value: &T,
) -> Result<()> {
<Self as ser::SerializeMap>::serialize_key(self, key)?;
<Self as ser::SerializeMap>::serialize_value(self, value)
}
fn end(self) -> Result<()> {
<Self as ser::SerializeMap>::end(self)
}
}
let mut extractor = ExtensionFieldExtractor::default();
value.serialize(&mut extractor)?;
Ok((extractor.id, extractor.extensions))
}
fn extract_array_values<T: ?Sized + Serialize>(value: &T) -> Result<Vec<Option<String>>> {
struct ArrayValueCollector {
values: Vec<Option<String>>,
}
impl<'a> ser::Serializer for &'a mut ArrayValueCollector {
type Ok = ();
type Error = SerdeError;
type SerializeSeq = ArrayValueSeqCollector<'a>;
type SerializeTuple = ser::Impossible<(), SerdeError>;
type SerializeTupleStruct = ser::Impossible<(), SerdeError>;
type SerializeTupleVariant = ser::Impossible<(), SerdeError>;
type SerializeMap = ser::Impossible<(), SerdeError>;
type SerializeStruct = ser::Impossible<(), SerdeError>;
type SerializeStructVariant = ser::Impossible<(), SerdeError>;
fn serialize_bool(self, _v: bool) -> Result<()> {
Err(SerdeError::Custom("Expected array".to_string()))
}
fn serialize_i8(self, _v: i8) -> Result<()> {
Err(SerdeError::Custom("Expected array".to_string()))
}
fn serialize_i16(self, _v: i16) -> Result<()> {
Err(SerdeError::Custom("Expected array".to_string()))
}
fn serialize_i32(self, _v: i32) -> Result<()> {
Err(SerdeError::Custom("Expected array".to_string()))
}
fn serialize_i64(self, _v: i64) -> Result<()> {
Err(SerdeError::Custom("Expected array".to_string()))
}
fn serialize_u8(self, _v: u8) -> Result<()> {
Err(SerdeError::Custom("Expected array".to_string()))
}
fn serialize_u16(self, _v: u16) -> Result<()> {
Err(SerdeError::Custom("Expected array".to_string()))
}
fn serialize_u32(self, _v: u32) -> Result<()> {
Err(SerdeError::Custom("Expected array".to_string()))
}
fn serialize_u64(self, _v: u64) -> Result<()> {
Err(SerdeError::Custom("Expected array".to_string()))
}
fn serialize_f32(self, _v: f32) -> Result<()> {
Err(SerdeError::Custom("Expected array".to_string()))
}
fn serialize_f64(self, _v: f64) -> Result<()> {
Err(SerdeError::Custom("Expected array".to_string()))
}
fn serialize_char(self, _v: char) -> Result<()> {
Err(SerdeError::Custom("Expected array".to_string()))
}
fn serialize_str(self, _v: &str) -> Result<()> {
Err(SerdeError::Custom("Expected array".to_string()))
}
fn serialize_bytes(self, _v: &[u8]) -> Result<()> {
Err(SerdeError::Custom("Expected array".to_string()))
}
fn serialize_none(self) -> Result<()> {
Err(SerdeError::Custom("Expected array".to_string()))
}
fn serialize_some<T: ?Sized + Serialize>(self, value: &T) -> Result<()> {
value.serialize(self)
}
fn serialize_unit(self) -> Result<()> {
Err(SerdeError::Custom("Expected array".to_string()))
}
fn serialize_unit_struct(self, _name: &'static str) -> Result<()> {
Err(SerdeError::Custom("Expected array".to_string()))
}
fn serialize_unit_variant(
self,
_name: &'static str,
_variant_index: u32,
_variant: &'static str,
) -> Result<()> {
Err(SerdeError::Custom("Expected array".to_string()))
}
fn serialize_newtype_struct<T: ?Sized + Serialize>(
self,
_name: &'static str,
value: &T,
) -> Result<()> {
value.serialize(self)
}
fn serialize_newtype_variant<T: ?Sized + Serialize>(
self,
_name: &'static str,
_variant_index: u32,
_variant: &'static str,
value: &T,
) -> Result<()> {
value.serialize(self)
}
fn serialize_seq(self, _len: Option<usize>) -> Result<Self::SerializeSeq> {
Ok(ArrayValueSeqCollector { parent: self })
}
fn serialize_tuple(self, _len: usize) -> Result<Self::SerializeTuple> {
Err(SerdeError::Custom("Expected array".to_string()))
}
fn serialize_tuple_struct(
self,
_name: &'static str,
_len: usize,
) -> Result<Self::SerializeTupleStruct> {
Err(SerdeError::Custom("Expected array".to_string()))
}
fn serialize_tuple_variant(
self,
_name: &'static str,
_variant_index: u32,
_variant: &'static str,
_len: usize,
) -> Result<Self::SerializeTupleVariant> {
Err(SerdeError::Custom("Expected array".to_string()))
}
fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap> {
Err(SerdeError::Custom("Expected array".to_string()))
}
fn serialize_struct(
self,
_name: &'static str,
_len: usize,
) -> Result<Self::SerializeStruct> {
Err(SerdeError::Custom("Expected array".to_string()))
}
fn serialize_struct_variant(
self,
_name: &'static str,
_variant_index: u32,
_variant: &'static str,
_len: usize,
) -> Result<Self::SerializeStructVariant> {
Err(SerdeError::Custom("Expected array".to_string()))
}
}
struct ArrayValueSeqCollector<'a> {
parent: &'a mut ArrayValueCollector,
}
impl<'a> ser::SerializeSeq for ArrayValueSeqCollector<'a> {
type Ok = ();
type Error = SerdeError;
fn serialize_element<T: ?Sized + Serialize>(&mut self, value: &T) -> Result<()> {
let val = try_serialize_as_primitive(value)?;
self.parent.values.push(val);
Ok(())
}
fn end(self) -> Result<()> {
Ok(())
}
}
let mut collector = ArrayValueCollector { values: Vec::new() };
value.serialize(&mut collector)?;
Ok(collector.values)
}
fn extract_array_extension_data<T: ?Sized + Serialize>(
value: &T,
) -> Result<Vec<Option<ArrayExtensionData>>> {
struct ArrayExtensionCollector {
extension_data: Vec<Option<ArrayExtensionData>>,
}
impl<'a> ser::Serializer for &'a mut ArrayExtensionCollector {
type Ok = ();
type Error = SerdeError;
type SerializeSeq = ArrayExtensionSeqCollector<'a>;
type SerializeTuple = ser::Impossible<(), SerdeError>;
type SerializeTupleStruct = ser::Impossible<(), SerdeError>;
type SerializeTupleVariant = ser::Impossible<(), SerdeError>;
type SerializeMap = ser::Impossible<(), SerdeError>;
type SerializeStruct = ser::Impossible<(), SerdeError>;
type SerializeStructVariant = ser::Impossible<(), SerdeError>;
fn serialize_bool(self, _v: bool) -> Result<()> {
Err(SerdeError::Custom("Expected array".to_string()))
}
fn serialize_i8(self, _v: i8) -> Result<()> {
Err(SerdeError::Custom("Expected array".to_string()))
}
fn serialize_i16(self, _v: i16) -> Result<()> {
Err(SerdeError::Custom("Expected array".to_string()))
}
fn serialize_i32(self, _v: i32) -> Result<()> {
Err(SerdeError::Custom("Expected array".to_string()))
}
fn serialize_i64(self, _v: i64) -> Result<()> {
Err(SerdeError::Custom("Expected array".to_string()))
}
fn serialize_u8(self, _v: u8) -> Result<()> {
Err(SerdeError::Custom("Expected array".to_string()))
}
fn serialize_u16(self, _v: u16) -> Result<()> {
Err(SerdeError::Custom("Expected array".to_string()))
}
fn serialize_u32(self, _v: u32) -> Result<()> {
Err(SerdeError::Custom("Expected array".to_string()))
}
fn serialize_u64(self, _v: u64) -> Result<()> {
Err(SerdeError::Custom("Expected array".to_string()))
}
fn serialize_f32(self, _v: f32) -> Result<()> {
Err(SerdeError::Custom("Expected array".to_string()))
}
fn serialize_f64(self, _v: f64) -> Result<()> {
Err(SerdeError::Custom("Expected array".to_string()))
}
fn serialize_char(self, _v: char) -> Result<()> {
Err(SerdeError::Custom("Expected array".to_string()))
}
fn serialize_str(self, _v: &str) -> Result<()> {
Err(SerdeError::Custom("Expected array".to_string()))
}
fn serialize_bytes(self, _v: &[u8]) -> Result<()> {
Err(SerdeError::Custom("Expected array".to_string()))
}
fn serialize_none(self) -> Result<()> {
Err(SerdeError::Custom("Expected array".to_string()))
}
fn serialize_some<T: ?Sized + Serialize>(self, value: &T) -> Result<()> {
value.serialize(self)
}
fn serialize_unit(self) -> Result<()> {
Err(SerdeError::Custom("Expected array".to_string()))
}
fn serialize_unit_struct(self, _name: &'static str) -> Result<()> {
Err(SerdeError::Custom("Expected array".to_string()))
}
fn serialize_unit_variant(
self,
_name: &'static str,
_variant_index: u32,
_variant: &'static str,
) -> Result<()> {
Err(SerdeError::Custom("Expected array".to_string()))
}
fn serialize_newtype_struct<T: ?Sized + Serialize>(
self,
_name: &'static str,
value: &T,
) -> Result<()> {
value.serialize(self)
}
fn serialize_newtype_variant<T: ?Sized + Serialize>(
self,
_name: &'static str,
_variant_index: u32,
_variant: &'static str,
value: &T,
) -> Result<()> {
value.serialize(self)
}
fn serialize_seq(self, _len: Option<usize>) -> Result<Self::SerializeSeq> {
Ok(ArrayExtensionSeqCollector { parent: self })
}
fn serialize_tuple(self, _len: usize) -> Result<Self::SerializeTuple> {
Err(SerdeError::Custom("Expected array".to_string()))
}
fn serialize_tuple_struct(
self,
_name: &'static str,
_len: usize,
) -> Result<Self::SerializeTupleStruct> {
Err(SerdeError::Custom("Expected array".to_string()))
}
fn serialize_tuple_variant(
self,
_name: &'static str,
_variant_index: u32,
_variant: &'static str,
_len: usize,
) -> Result<Self::SerializeTupleVariant> {
Err(SerdeError::Custom("Expected array".to_string()))
}
fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap> {
Err(SerdeError::Custom("Expected array".to_string()))
}
fn serialize_struct(
self,
_name: &'static str,
_len: usize,
) -> Result<Self::SerializeStruct> {
Err(SerdeError::Custom("Expected array".to_string()))
}
fn serialize_struct_variant(
self,
_name: &'static str,
_variant_index: u32,
_variant: &'static str,
_len: usize,
) -> Result<Self::SerializeStructVariant> {
Err(SerdeError::Custom("Expected array".to_string()))
}
}
struct ArrayExtensionSeqCollector<'a> {
parent: &'a mut ArrayExtensionCollector,
}
impl<'a> ser::SerializeSeq for ArrayExtensionSeqCollector<'a> {
type Ok = ();
type Error = SerdeError;
fn serialize_element<T: ?Sized + Serialize>(&mut self, value: &T) -> Result<()> {
if is_none_value(value)? {
self.parent.extension_data.push(None);
} else {
let (id, extensions) = extract_extension_fields(value)?;
self.parent
.extension_data
.push(Some(ArrayExtensionData { id, extensions }));
}
Ok(())
}
fn end(self) -> Result<()> {
Ok(())
}
}
let mut collector = ArrayExtensionCollector {
extension_data: Vec::new(),
};
value.serialize(&mut collector)?;
Ok(collector.extension_data)
}
fn is_none_value<T: ?Sized + Serialize>(value: &T) -> Result<bool> {
struct NoneDetector(bool, bool);
impl ser::Serializer for &mut NoneDetector {
type Ok = ();
type Error = SerdeError;
type SerializeSeq = ser::Impossible<(), SerdeError>;
type SerializeTuple = ser::Impossible<(), SerdeError>;
type SerializeTupleStruct = ser::Impossible<(), SerdeError>;
type SerializeTupleVariant = ser::Impossible<(), SerdeError>;
type SerializeMap = ser::Impossible<(), SerdeError>;
type SerializeStruct = ser::Impossible<(), SerdeError>;
type SerializeStructVariant = ser::Impossible<(), SerdeError>;
fn serialize_bool(self, _v: bool) -> Result<()> {
self.0 = false;
Ok(())
}
fn serialize_i8(self, _v: i8) -> Result<()> {
self.0 = false;
Ok(())
}
fn serialize_i16(self, _v: i16) -> Result<()> {
self.0 = false;
Ok(())
}
fn serialize_i32(self, _v: i32) -> Result<()> {
self.0 = false;
Ok(())
}
fn serialize_i64(self, _v: i64) -> Result<()> {
self.0 = false;
Ok(())
}
fn serialize_u8(self, _v: u8) -> Result<()> {
self.0 = false;
Ok(())
}
fn serialize_u16(self, _v: u16) -> Result<()> {
self.0 = false;
Ok(())
}
fn serialize_u32(self, _v: u32) -> Result<()> {
self.0 = false;
Ok(())
}
fn serialize_u64(self, _v: u64) -> Result<()> {
self.0 = false;
Ok(())
}
fn serialize_f32(self, _v: f32) -> Result<()> {
self.0 = false;
Ok(())
}
fn serialize_f64(self, _v: f64) -> Result<()> {
self.0 = false;
Ok(())
}
fn serialize_char(self, _v: char) -> Result<()> {
self.0 = false;
Ok(())
}
fn serialize_str(self, _v: &str) -> Result<()> {
self.0 = false;
Ok(())
}
fn serialize_bytes(self, _v: &[u8]) -> Result<()> {
self.0 = false;
Ok(())
}
fn serialize_none(self) -> Result<()> {
self.0 = true;
Ok(())
}
fn serialize_some<T: ?Sized + Serialize>(self, _value: &T) -> Result<()> {
self.0 = false;
Ok(())
}
fn serialize_unit(self) -> Result<()> {
self.0 = false;
Ok(())
}
fn serialize_unit_struct(self, _name: &'static str) -> Result<()> {
self.0 = false;
Ok(())
}
fn serialize_unit_variant(
self,
_name: &'static str,
_variant_index: u32,
_variant: &'static str,
) -> Result<()> {
self.0 = false;
Ok(())
}
fn serialize_newtype_struct<T: ?Sized + Serialize>(
self,
_name: &'static str,
_value: &T,
) -> Result<()> {
self.0 = false;
self.1 = true;
Err(SerdeError::Custom("Not none".to_string()))
}
fn serialize_newtype_variant<T: ?Sized + Serialize>(
self,
_name: &'static str,
_variant_index: u32,
_variant: &'static str,
_value: &T,
) -> Result<()> {
self.0 = false;
self.1 = true;
Err(SerdeError::Custom("Not none".to_string()))
}
fn serialize_seq(self, _len: Option<usize>) -> Result<Self::SerializeSeq> {
self.0 = false;
self.1 = true;
Err(SerdeError::Custom("Not none".to_string()))
}
fn serialize_tuple(self, _len: usize) -> Result<Self::SerializeTuple> {
self.0 = false;
self.1 = true;
Err(SerdeError::Custom("Not none".to_string()))
}
fn serialize_tuple_struct(
self,
_name: &'static str,
_len: usize,
) -> Result<Self::SerializeTupleStruct> {
self.0 = false;
self.1 = true;
Err(SerdeError::Custom("Not none".to_string()))
}
fn serialize_tuple_variant(
self,
_name: &'static str,
_variant_index: u32,
_variant: &'static str,
_len: usize,
) -> Result<Self::SerializeTupleVariant> {
self.0 = false;
self.1 = true;
Err(SerdeError::Custom("Not none".to_string()))
}
fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap> {
self.0 = false;
self.1 = true;
Err(SerdeError::Custom("Not none".to_string()))
}
fn serialize_struct(
self,
_name: &'static str,
_len: usize,
) -> Result<Self::SerializeStruct> {
self.0 = false;
self.1 = true;
Err(SerdeError::Custom("Not none".to_string()))
}
fn serialize_struct_variant(
self,
_name: &'static str,
_variant_index: u32,
_variant: &'static str,
_len: usize,
) -> Result<Self::SerializeStructVariant> {
self.0 = false;
self.1 = true;
Err(SerdeError::Custom("Not none".to_string()))
}
}
let mut detector = NoneDetector(false, false);
match value.serialize(&mut detector) {
Ok(()) => Ok(detector.0),
Err(_) if detector.1 => Ok(detector.0),
Err(e) => Err(e),
}
}
fn is_array_value<T: ?Sized + Serialize>(value: &T) -> Result<bool> {
struct ArrayDetector(bool, bool);
impl ser::Serializer for &mut ArrayDetector {
type Ok = ();
type Error = SerdeError;
type SerializeSeq = ser::Impossible<(), SerdeError>;
type SerializeTuple = ser::Impossible<(), SerdeError>;
type SerializeTupleStruct = ser::Impossible<(), SerdeError>;
type SerializeTupleVariant = ser::Impossible<(), SerdeError>;
type SerializeMap = ser::Impossible<(), SerdeError>;
type SerializeStruct = ser::Impossible<(), SerdeError>;
type SerializeStructVariant = ser::Impossible<(), SerdeError>;
fn serialize_bool(self, _v: bool) -> Result<()> {
self.0 = false;
Ok(())
}
fn serialize_i8(self, _v: i8) -> Result<()> {
self.0 = false;
Ok(())
}
fn serialize_i16(self, _v: i16) -> Result<()> {
self.0 = false;
Ok(())
}
fn serialize_i32(self, _v: i32) -> Result<()> {
self.0 = false;
Ok(())
}
fn serialize_i64(self, _v: i64) -> Result<()> {
self.0 = false;
Ok(())
}
fn serialize_u8(self, _v: u8) -> Result<()> {
self.0 = false;
Ok(())
}
fn serialize_u16(self, _v: u16) -> Result<()> {
self.0 = false;
Ok(())
}
fn serialize_u32(self, _v: u32) -> Result<()> {
self.0 = false;
Ok(())
}
fn serialize_u64(self, _v: u64) -> Result<()> {
self.0 = false;
Ok(())
}
fn serialize_f32(self, _v: f32) -> Result<()> {
self.0 = false;
Ok(())
}
fn serialize_f64(self, _v: f64) -> Result<()> {
self.0 = false;
Ok(())
}
fn serialize_char(self, _v: char) -> Result<()> {
self.0 = false;
Ok(())
}
fn serialize_str(self, _v: &str) -> Result<()> {
self.0 = false;
Ok(())
}
fn serialize_bytes(self, _v: &[u8]) -> Result<()> {
self.0 = false;
Ok(())
}
fn serialize_none(self) -> Result<()> {
self.0 = false;
Ok(())
}
fn serialize_some<T: ?Sized + Serialize>(self, value: &T) -> Result<()> {
self.0 = false;
value.serialize(self)
}
fn serialize_unit(self) -> Result<()> {
self.0 = false;
Ok(())
}
fn serialize_unit_struct(self, _name: &'static str) -> Result<()> {
self.0 = false;
Ok(())
}
fn serialize_unit_variant(
self,
_name: &'static str,
_variant_index: u32,
_variant: &'static str,
) -> Result<()> {
self.0 = false;
Ok(())
}
fn serialize_newtype_struct<T: ?Sized + Serialize>(
self,
_name: &'static str,
value: &T,
) -> Result<()> {
self.0 = false;
value.serialize(self)
}
fn serialize_newtype_variant<T: ?Sized + Serialize>(
self,
_name: &'static str,
_variant_index: u32,
_variant: &'static str,
value: &T,
) -> Result<()> {
self.0 = false;
value.serialize(self)
}
fn serialize_seq(self, _len: Option<usize>) -> Result<Self::SerializeSeq> {
self.0 = true;
self.1 = true;
Err(SerdeError::Custom("Array detected".to_string()))
}
fn serialize_tuple(self, _len: usize) -> Result<Self::SerializeTuple> {
self.0 = true;
self.1 = true;
Err(SerdeError::Custom("Array detected".to_string()))
}
fn serialize_tuple_struct(
self,
_name: &'static str,
_len: usize,
) -> Result<Self::SerializeTupleStruct> {
self.0 = true;
self.1 = true;
Err(SerdeError::Custom("Array detected".to_string()))
}
fn serialize_tuple_variant(
self,
_name: &'static str,
_variant_index: u32,
_variant: &'static str,
_len: usize,
) -> Result<Self::SerializeTupleVariant> {
self.0 = true;
self.1 = true;
Err(SerdeError::Custom("Array detected".to_string()))
}
fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap> {
self.0 = false;
self.1 = true;
Err(SerdeError::Custom("Not an array".to_string()))
}
fn serialize_struct(
self,
_name: &'static str,
_len: usize,
) -> Result<Self::SerializeStruct> {
self.0 = false;
self.1 = true;
Err(SerdeError::Custom("Not an array".to_string()))
}
fn serialize_struct_variant(
self,
_name: &'static str,
_variant_index: u32,
_variant: &'static str,
_len: usize,
) -> Result<Self::SerializeStructVariant> {
self.0 = false;
self.1 = true;
Err(SerdeError::Custom("Not an array".to_string()))
}
}
let mut detector = ArrayDetector(false, false);
match value.serialize(&mut detector) {
Ok(()) => Ok(detector.0),
Err(_) if detector.1 => Ok(detector.0),
Err(e) => Err(e),
}
}
fn try_serialize_as_primitive<T: ?Sized + Serialize>(value: &T) -> Result<Option<String>> {
const RAW_VALUE_TOKEN: &str = "$serde_json::private::RawValue";
const SERDE_JSON_NUMBER_TOKEN: &str = "$serde_json::private::Number";
struct PrimitiveCapture(Option<String>);
enum PrimitiveStructKind {
RawValue,
JsonNumber,
}
struct PrimitiveStruct<'a> {
capture: &'a mut PrimitiveCapture,
kind: PrimitiveStructKind,
has_value: bool,
}
impl<'a> ser::Serializer for &'a mut PrimitiveCapture {
type Ok = ();
type Error = SerdeError;
type SerializeSeq = ser::Impossible<(), SerdeError>;
type SerializeTuple = ser::Impossible<(), SerdeError>;
type SerializeTupleStruct = ser::Impossible<(), SerdeError>;
type SerializeTupleVariant = ser::Impossible<(), SerdeError>;
type SerializeMap = ser::Impossible<(), SerdeError>;
type SerializeStruct = PrimitiveStruct<'a>;
type SerializeStructVariant = ser::Impossible<(), SerdeError>;
fn serialize_bool(self, v: bool) -> Result<()> {
self.0 = Some(utils::bool_to_string(v).to_string());
Ok(())
}
fn serialize_i8(self, v: i8) -> Result<()> {
self.0 = Some(v.to_string());
Ok(())
}
fn serialize_i16(self, v: i16) -> Result<()> {
self.0 = Some(v.to_string());
Ok(())
}
fn serialize_i32(self, v: i32) -> Result<()> {
self.0 = Some(v.to_string());
Ok(())
}
fn serialize_i64(self, v: i64) -> Result<()> {
self.0 = Some(v.to_string());
Ok(())
}
fn serialize_u8(self, v: u8) -> Result<()> {
self.0 = Some(v.to_string());
Ok(())
}
fn serialize_u16(self, v: u16) -> Result<()> {
self.0 = Some(v.to_string());
Ok(())
}
fn serialize_u32(self, v: u32) -> Result<()> {
self.0 = Some(v.to_string());
Ok(())
}
fn serialize_u64(self, v: u64) -> Result<()> {
self.0 = Some(v.to_string());
Ok(())
}
fn serialize_f32(self, v: f32) -> Result<()> {
self.0 = Some(v.to_string());
Ok(())
}
fn serialize_f64(self, v: f64) -> Result<()> {
self.0 = Some(v.to_string());
Ok(())
}
fn serialize_char(self, v: char) -> Result<()> {
self.0 = Some(v.to_string());
Ok(())
}
fn serialize_str(self, v: &str) -> Result<()> {
self.0 = Some(v.to_string());
Ok(())
}
fn serialize_bytes(self, _v: &[u8]) -> Result<()> {
Ok(())
}
fn serialize_none(self) -> Result<()> {
Ok(())
}
fn serialize_some<T: ?Sized + Serialize>(self, value: &T) -> Result<()> {
value.serialize(self)
}
fn serialize_unit(self) -> Result<()> {
Ok(())
}
fn serialize_unit_struct(self, _name: &'static str) -> Result<()> {
Ok(())
}
fn serialize_unit_variant(
self,
_name: &'static str,
_variant_index: u32,
variant: &'static str,
) -> Result<()> {
self.0 = Some(variant.to_string());
Ok(())
}
fn serialize_newtype_struct<T: ?Sized + Serialize>(
self,
_name: &'static str,
value: &T,
) -> Result<()> {
value.serialize(self)
}
fn serialize_newtype_variant<T: ?Sized + Serialize>(
self,
_name: &'static str,
_variant_index: u32,
_variant: &'static str,
value: &T,
) -> Result<()> {
value.serialize(self)
}
fn serialize_seq(self, _len: Option<usize>) -> Result<Self::SerializeSeq> {
Err(SerdeError::Custom("Not a primitive".to_string()))
}
fn serialize_tuple(self, _len: usize) -> Result<Self::SerializeTuple> {
Err(SerdeError::Custom("Not a primitive".to_string()))
}
fn serialize_tuple_struct(
self,
_name: &'static str,
_len: usize,
) -> Result<Self::SerializeTupleStruct> {
Err(SerdeError::Custom("Not a primitive".to_string()))
}
fn serialize_tuple_variant(
self,
_name: &'static str,
_variant_index: u32,
_variant: &'static str,
_len: usize,
) -> Result<Self::SerializeTupleVariant> {
Err(SerdeError::Custom("Not a primitive".to_string()))
}
fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap> {
Err(SerdeError::Custom("Not a primitive".to_string()))
}
fn serialize_struct(
self,
name: &'static str,
_len: usize,
) -> Result<Self::SerializeStruct> {
match name {
RAW_VALUE_TOKEN => Ok(PrimitiveStruct {
capture: self,
kind: PrimitiveStructKind::RawValue,
has_value: false,
}),
SERDE_JSON_NUMBER_TOKEN => Ok(PrimitiveStruct {
capture: self,
kind: PrimitiveStructKind::JsonNumber,
has_value: false,
}),
_ => Err(SerdeError::Custom("Not a primitive".to_string())),
}
}
fn serialize_struct_variant(
self,
_name: &'static str,
_variant_index: u32,
_variant: &'static str,
_len: usize,
) -> Result<Self::SerializeStructVariant> {
Err(SerdeError::Custom("Not a primitive".to_string()))
}
}
impl<'a> ser::SerializeStruct for PrimitiveStruct<'a> {
type Ok = ();
type Error = SerdeError;
fn serialize_field<T: ?Sized + Serialize>(
&mut self,
key: &'static str,
value: &T,
) -> Result<()> {
let expected_key = match self.kind {
PrimitiveStructKind::RawValue => RAW_VALUE_TOKEN,
PrimitiveStructKind::JsonNumber => SERDE_JSON_NUMBER_TOKEN,
};
if key != expected_key {
return Err(SerdeError::Custom(format!(
"Unexpected field while serializing {expected_key}"
)));
}
if self.has_value {
return Err(SerdeError::Custom(format!(
"Duplicate field while serializing {expected_key}"
)));
}
let mut inner = PrimitiveCapture(None);
value.serialize(&mut inner)?;
if let Some(raw) = inner.0 {
self.capture.0 = Some(raw);
self.has_value = true;
Ok(())
} else {
Err(SerdeError::Custom(format!(
"{expected_key} did not serialize to a primitive string"
)))
}
}
fn end(self) -> Result<()> {
if self.has_value {
Ok(())
} else {
let missing = match self.kind {
PrimitiveStructKind::RawValue => "RawValue",
PrimitiveStructKind::JsonNumber => "Number",
};
Err(SerdeError::Custom(format!(
"{missing} missing inner value during serialization"
)))
}
}
}
let mut capture = PrimitiveCapture(None);
match value.serialize(&mut capture) {
Ok(()) => Ok(capture.0),
Err(e) if e.to_string().contains("Not a primitive") => Ok(None),
Err(e) => Err(e),
}
}
pub struct MapSerializer<'a, W: Write> {
serializer: &'a mut XmlSerializer<W>,
current_key: Option<String>,
resource_element_open: bool,
}
impl<'a, W: Write> ser::SerializeMap for MapSerializer<'a, W> {
type Ok = ();
type Error = SerdeError;
fn serialize_key<T>(&mut self, key: &T) -> Result<()>
where
T: ?Sized + Serialize,
{
struct KeyCapture(Option<String>);
impl ser::Serializer for &mut KeyCapture {
type Ok = ();
type Error = SerdeError;
type SerializeSeq = ser::Impossible<(), SerdeError>;
type SerializeTuple = ser::Impossible<(), SerdeError>;
type SerializeTupleStruct = ser::Impossible<(), SerdeError>;
type SerializeTupleVariant = ser::Impossible<(), SerdeError>;
type SerializeMap = ser::Impossible<(), SerdeError>;
type SerializeStruct = ser::Impossible<(), SerdeError>;
type SerializeStructVariant = ser::Impossible<(), SerdeError>;
fn serialize_str(self, v: &str) -> Result<()> {
self.0 = Some(v.to_string());
Ok(())
}
fn serialize_bool(self, _v: bool) -> Result<()> {
Err(SerdeError::Custom("Keys must be strings".to_string()))
}
fn serialize_i8(self, _v: i8) -> Result<()> {
Err(SerdeError::Custom("Keys must be strings".to_string()))
}
fn serialize_i16(self, _v: i16) -> Result<()> {
Err(SerdeError::Custom("Keys must be strings".to_string()))
}
fn serialize_i32(self, _v: i32) -> Result<()> {
Err(SerdeError::Custom("Keys must be strings".to_string()))
}
fn serialize_i64(self, _v: i64) -> Result<()> {
Err(SerdeError::Custom("Keys must be strings".to_string()))
}
fn serialize_u8(self, _v: u8) -> Result<()> {
Err(SerdeError::Custom("Keys must be strings".to_string()))
}
fn serialize_u16(self, _v: u16) -> Result<()> {
Err(SerdeError::Custom("Keys must be strings".to_string()))
}
fn serialize_u32(self, _v: u32) -> Result<()> {
Err(SerdeError::Custom("Keys must be strings".to_string()))
}
fn serialize_u64(self, _v: u64) -> Result<()> {
Err(SerdeError::Custom("Keys must be strings".to_string()))
}
fn serialize_f32(self, _v: f32) -> Result<()> {
Err(SerdeError::Custom("Keys must be strings".to_string()))
}
fn serialize_f64(self, _v: f64) -> Result<()> {
Err(SerdeError::Custom("Keys must be strings".to_string()))
}
fn serialize_char(self, _v: char) -> Result<()> {
Err(SerdeError::Custom("Keys must be strings".to_string()))
}
fn serialize_bytes(self, _v: &[u8]) -> Result<()> {
Err(SerdeError::Custom("Keys must be strings".to_string()))
}
fn serialize_none(self) -> Result<()> {
Err(SerdeError::Custom("Keys must be strings".to_string()))
}
fn serialize_some<T: ?Sized + Serialize>(self, _value: &T) -> Result<()> {
Err(SerdeError::Custom("Keys must be strings".to_string()))
}
fn serialize_unit(self) -> Result<()> {
Err(SerdeError::Custom("Keys must be strings".to_string()))
}
fn serialize_unit_struct(self, _name: &'static str) -> Result<()> {
Err(SerdeError::Custom("Keys must be strings".to_string()))
}
fn serialize_unit_variant(
self,
_name: &'static str,
_variant_index: u32,
_variant: &'static str,
) -> Result<()> {
Err(SerdeError::Custom("Keys must be strings".to_string()))
}
fn serialize_newtype_struct<T: ?Sized + Serialize>(
self,
_name: &'static str,
_value: &T,
) -> Result<()> {
Err(SerdeError::Custom("Keys must be strings".to_string()))
}
fn serialize_newtype_variant<T: ?Sized + Serialize>(
self,
_name: &'static str,
_variant_index: u32,
_variant: &'static str,
_value: &T,
) -> Result<()> {
Err(SerdeError::Custom("Keys must be strings".to_string()))
}
fn serialize_seq(self, _len: Option<usize>) -> Result<Self::SerializeSeq> {
Err(SerdeError::Custom("Keys must be strings".to_string()))
}
fn serialize_tuple(self, _len: usize) -> Result<Self::SerializeTuple> {
Err(SerdeError::Custom("Keys must be strings".to_string()))
}
fn serialize_tuple_struct(
self,
_name: &'static str,
_len: usize,
) -> Result<Self::SerializeTupleStruct> {
Err(SerdeError::Custom("Keys must be strings".to_string()))
}
fn serialize_tuple_variant(
self,
_name: &'static str,
_variant_index: u32,
_variant: &'static str,
_len: usize,
) -> Result<Self::SerializeTupleVariant> {
Err(SerdeError::Custom("Keys must be strings".to_string()))
}
fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap> {
Err(SerdeError::Custom("Keys must be strings".to_string()))
}
fn serialize_struct(
self,
_name: &'static str,
_len: usize,
) -> Result<Self::SerializeStruct> {
Err(SerdeError::Custom("Keys must be strings".to_string()))
}
fn serialize_struct_variant(
self,
_name: &'static str,
_variant_index: u32,
_variant: &'static str,
_len: usize,
) -> Result<Self::SerializeStructVariant> {
Err(SerdeError::Custom("Keys must be strings".to_string()))
}
}
let mut capture = KeyCapture(None);
key.serialize(&mut capture)?;
self.current_key = capture.0;
Ok(())
}
fn serialize_value<T>(&mut self, value: &T) -> Result<()>
where
T: ?Sized + Serialize,
{
let key = self
.current_key
.take()
.ok_or_else(|| SerdeError::Custom("No key for value".to_string()))?;
if key == "resourceType" && !self.resource_element_open {
if let Some(resource_type) = try_serialize_as_primitive(value)? {
self.serializer.start_resource_element(&resource_type)?;
self.resource_element_open = true;
return Ok(());
}
}
if utils::is_extension_field(&key) {
let base_name = utils::strip_underscore(&key);
let is_ext_array = is_array_value(value)?;
if let Some(pending) = self.serializer.pending_field.take() {
if pending.name() == base_name {
match pending {
PendingField::Single(mut field) => {
if !is_ext_array {
let (id, extensions) = extract_extension_fields(value)?;
if let Some(id_val) = id {
field.id = Some(id_val);
}
if !extensions.is_empty() {
field.extensions.extend(extensions);
}
self.serializer.pending_field = Some(PendingField::Single(field));
return Ok(());
} else {
let ext_data = extract_array_extension_data(value)?;
let mut values = vec![field.value];
while values.len() < ext_data.len() {
values.push(None);
}
self.serializer.pending_field =
Some(PendingField::Array(ArrayFieldBuffer {
name: base_name.to_string(),
values,
extension_data: ext_data,
}));
return Ok(());
}
}
PendingField::Array(mut array) => {
if is_ext_array {
let ext_data = extract_array_extension_data(value)?;
array.extension_data = ext_data;
self.serializer.pending_field = Some(PendingField::Array(array));
return Ok(());
} else {
self.serializer.pending_field = Some(PendingField::Array(array));
return Ok(());
}
}
}
} else {
match pending {
PendingField::Single(field) => self.serializer.write_field(field)?,
PendingField::Array(array) => self.serializer.write_array_field(array)?,
}
}
}
if is_ext_array {
let ext_data = extract_array_extension_data(value)?;
self.serializer.pending_field = Some(PendingField::Array(ArrayFieldBuffer {
name: base_name.to_string(),
values: Vec::new(),
extension_data: ext_data,
}));
} else {
let mut pending = FieldBuffer::new(base_name.to_string());
let (id, extensions) = extract_extension_fields(value)?;
pending.id = id;
pending.extensions = extensions;
self.serializer.pending_field = Some(PendingField::Single(pending));
}
Ok(())
} else {
if let Some(pending) = self.serializer.pending_field.take() {
if pending.name() != key {
match pending {
PendingField::Single(field) => self.serializer.write_field(field)?,
PendingField::Array(array) => self.serializer.write_array_field(array)?,
}
} else {
self.serializer.pending_field = Some(pending);
}
}
if let Some(pending) = self.serializer.pending_field.take() {
if pending.name() == key {
match pending {
PendingField::Single(mut field) => {
if let Some(val_str) = try_serialize_as_primitive(value)? {
field.value = Some(val_str);
self.serializer.pending_field = Some(PendingField::Single(field));
return Ok(());
}
return Err(SerdeError::Custom(
"Complex types not yet supported in field buffer".to_string(),
));
}
PendingField::Array(mut array) => {
let values = extract_array_values(value)?;
array.values = values;
self.serializer.pending_field = Some(PendingField::Array(array));
return Ok(());
}
}
} else {
self.serializer.pending_field = Some(pending);
}
}
if let Some(val_str) = try_serialize_as_primitive(value)? {
let mut pending = FieldBuffer::new(key.clone());
pending.value = Some(val_str);
self.serializer.pending_field = Some(PendingField::Single(pending));
return Ok(());
}
if is_none_value(value)? {
return Ok(());
}
let is_array = is_array_value(value)?;
if is_array {
if let Some(pending) = self.serializer.pending_field.take() {
match pending {
PendingField::Single(field) => self.serializer.write_field(field)?,
PendingField::Array(array) => self.serializer.write_array_field(array)?,
}
}
let values = extract_array_values(value)?;
let has_primitive = values.iter().any(|v| v.is_some());
if has_primitive {
self.serializer.pending_field = Some(PendingField::Array(ArrayFieldBuffer {
name: key.clone(),
values,
extension_data: Vec::new(),
}));
Ok(())
} else {
let mut seq_serializer = NamedSeqSerializer {
serializer: self.serializer,
element_name: key.clone(),
};
value.serialize(&mut seq_serializer)?;
Ok(())
}
} else {
if let Some(pending) = self.serializer.pending_field.take() {
match pending {
PendingField::Single(field) => self.serializer.write_field(field)?,
PendingField::Array(array) => self.serializer.write_array_field(array)?,
}
}
let is_resource = utils::is_resource_name(&key);
self.serializer.write_start_element(&key, is_resource)?;
value.serialize(&mut *self.serializer)?;
self.serializer.write_end_element(&key)?;
Ok(())
}
}
}
fn end(self) -> Result<()> {
if let Some(pending) = self.serializer.pending_field.take() {
match pending {
PendingField::Single(field) => self.serializer.write_field(field)?,
PendingField::Array(array) => self.serializer.write_array_field(array)?,
}
}
if self.resource_element_open {
self.serializer.end_resource_element()?;
}
Ok(())
}
}
impl<'a, W: Write> ser::SerializeStruct for MapSerializer<'a, W> {
type Ok = ();
type Error = SerdeError;
fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<()>
where
T: ?Sized + Serialize,
{
<Self as ser::SerializeMap>::serialize_key(self, key)?;
<Self as ser::SerializeMap>::serialize_value(self, value)
}
fn end(self) -> Result<()> {
<Self as ser::SerializeMap>::end(self)
}
}
impl<W: Write> ser::SerializeTuple for &mut XmlSerializer<W> {
type Ok = ();
type Error = SerdeError;
fn serialize_element<T>(&mut self, _value: &T) -> Result<()>
where
T: ?Sized + Serialize,
{
Err(SerdeError::Custom("Tuples not supported".to_string()))
}
fn end(self) -> Result<()> {
Ok(())
}
}
impl<W: Write> ser::SerializeTupleStruct for &mut XmlSerializer<W> {
type Ok = ();
type Error = SerdeError;
fn serialize_field<T>(&mut self, _value: &T) -> Result<()>
where
T: ?Sized + Serialize,
{
Err(SerdeError::Custom(
"Tuple structs not supported".to_string(),
))
}
fn end(self) -> Result<()> {
Ok(())
}
}
impl<W: Write> ser::SerializeTupleVariant for &mut XmlSerializer<W> {
type Ok = ();
type Error = SerdeError;
fn serialize_field<T>(&mut self, _value: &T) -> Result<()>
where
T: ?Sized + Serialize,
{
Err(SerdeError::Custom(
"Tuple variants not supported".to_string(),
))
}
fn end(self) -> Result<()> {
Ok(())
}
}
impl<W: Write> ser::SerializeStructVariant for &mut XmlSerializer<W> {
type Ok = ();
type Error = SerdeError;
fn serialize_field<T>(&mut self, _key: &'static str, _value: &T) -> Result<()>
where
T: ?Sized + Serialize,
{
Err(SerdeError::Custom(
"Struct variants not supported".to_string(),
))
}
fn end(self) -> Result<()> {
Ok(())
}
}