use super::error::SerdeError;
use crate::Schema;
use aws_smithy_types::{BigDecimal, BigInteger, Blob, DateTime, Document};
pub trait ShapeSerializer {
fn write_struct(
&mut self,
schema: &Schema,
value: &dyn SerializableStruct,
) -> Result<(), SerdeError>;
fn write_list(
&mut self,
schema: &Schema,
write_elements: &dyn Fn(&mut dyn ShapeSerializer) -> Result<(), SerdeError>,
) -> Result<(), SerdeError>;
fn write_map(
&mut self,
schema: &Schema,
write_entries: &dyn Fn(&mut dyn ShapeSerializer) -> Result<(), SerdeError>,
) -> Result<(), SerdeError>;
fn write_boolean(&mut self, schema: &Schema, value: bool) -> Result<(), SerdeError>;
fn write_byte(&mut self, schema: &Schema, value: i8) -> Result<(), SerdeError>;
fn write_short(&mut self, schema: &Schema, value: i16) -> Result<(), SerdeError>;
fn write_integer(&mut self, schema: &Schema, value: i32) -> Result<(), SerdeError>;
fn write_long(&mut self, schema: &Schema, value: i64) -> Result<(), SerdeError>;
fn write_float(&mut self, schema: &Schema, value: f32) -> Result<(), SerdeError>;
fn write_double(&mut self, schema: &Schema, value: f64) -> Result<(), SerdeError>;
fn write_big_integer(&mut self, schema: &Schema, value: &BigInteger) -> Result<(), SerdeError>;
fn write_big_decimal(&mut self, schema: &Schema, value: &BigDecimal) -> Result<(), SerdeError>;
fn write_string(&mut self, schema: &Schema, value: &str) -> Result<(), SerdeError>;
fn write_blob(&mut self, schema: &Schema, value: &Blob) -> Result<(), SerdeError>;
fn write_timestamp(&mut self, schema: &Schema, value: &DateTime) -> Result<(), SerdeError>;
fn write_document(&mut self, schema: &Schema, value: &Document) -> Result<(), SerdeError>;
fn write_null(&mut self, schema: &Schema) -> Result<(), SerdeError>;
fn write_string_list(&mut self, schema: &Schema, values: &[String]) -> Result<(), SerdeError> {
self.write_list(schema, &|ser| {
for item in values {
ser.write_string(&crate::prelude::STRING, item)?;
}
Ok(())
})
}
fn write_blob_list(
&mut self,
schema: &Schema,
values: &[aws_smithy_types::Blob],
) -> Result<(), SerdeError> {
self.write_list(schema, &|ser| {
for item in values {
ser.write_blob(&crate::prelude::BLOB, item)?;
}
Ok(())
})
}
fn write_integer_list(&mut self, schema: &Schema, values: &[i32]) -> Result<(), SerdeError> {
self.write_list(schema, &|ser| {
for item in values {
ser.write_integer(&crate::prelude::INTEGER, *item)?;
}
Ok(())
})
}
fn write_long_list(&mut self, schema: &Schema, values: &[i64]) -> Result<(), SerdeError> {
self.write_list(schema, &|ser| {
for item in values {
ser.write_long(&crate::prelude::LONG, *item)?;
}
Ok(())
})
}
fn write_string_string_map(
&mut self,
schema: &Schema,
values: &std::collections::HashMap<String, String>,
) -> Result<(), SerdeError> {
self.write_map(schema, &|ser| {
for (key, value) in values {
ser.write_string(&crate::prelude::STRING, key)?;
ser.write_string(&crate::prelude::STRING, value)?;
}
Ok(())
})
}
}
pub trait SerializableStruct {
fn serialize_members(&self, serializer: &mut dyn ShapeSerializer) -> Result<(), SerdeError>;
}
impl<T: SerializableStruct + ?Sized> SerializableStruct for Box<T> {
fn serialize_members(&self, serializer: &mut dyn ShapeSerializer) -> Result<(), SerdeError> {
(**self).serialize_members(serializer)
}
}