pub mod http_string;
use crate::serde::{ShapeDeserializer, ShapeSerializer};
pub trait FinishSerializer {
fn finish(self) -> Vec<u8>;
}
pub trait Codec {
type Serializer: ShapeSerializer + FinishSerializer;
type Deserializer<'a>: ShapeDeserializer + 'a;
fn create_serializer(&self) -> Self::Serializer;
fn create_deserializer<'a>(&self, input: &'a [u8]) -> Self::Deserializer<'a>;
}
pub trait PayloadSerializer: ShapeSerializer {
fn finish_boxed(self: Box<Self>) -> Vec<u8>;
}
impl<S> PayloadSerializer for S
where
S: ShapeSerializer + FinishSerializer,
{
fn finish_boxed(self: Box<Self>) -> Vec<u8> {
<S as FinishSerializer>::finish(*self)
}
}
pub trait DynCodec: Send + Sync + std::fmt::Debug {
fn create_deserializer<'a>(&self, input: &'a [u8]) -> Box<dyn ShapeDeserializer + 'a>;
fn create_serializer(&self) -> Box<dyn PayloadSerializer + '_>;
}
impl<C> DynCodec for C
where
C: Codec + Send + Sync + std::fmt::Debug,
{
fn create_deserializer<'a>(&self, input: &'a [u8]) -> Box<dyn ShapeDeserializer + 'a> {
Box::new(<C as Codec>::create_deserializer(self, input))
}
fn create_serializer(&self) -> Box<dyn PayloadSerializer + '_> {
Box::new(<C as Codec>::create_serializer(self))
}
}
#[cfg(test)]
mod test {
use super::*;
use crate::serde::{SerdeError, SerializableStruct, ShapeDeserializer, ShapeSerializer};
use crate::{prelude::*, Schema};
struct MockSerializer {
output: Vec<u8>,
}
impl MockSerializer {
fn finish(self) -> Vec<u8> {
self.output
}
}
impl FinishSerializer for MockSerializer {
fn finish(self) -> Vec<u8> {
self.output
}
}
impl ShapeSerializer for MockSerializer {
fn write_struct(
&mut self,
_schema: &Schema,
_value: &dyn SerializableStruct,
) -> Result<(), SerdeError> {
Ok(())
}
fn write_list(
&mut self,
_schema: &Schema,
_write_elements: &dyn Fn(&mut dyn ShapeSerializer) -> Result<(), SerdeError>,
) -> Result<(), SerdeError> {
Ok(())
}
fn write_map(
&mut self,
_schema: &Schema,
_write_entries: &dyn Fn(&mut dyn ShapeSerializer) -> Result<(), SerdeError>,
) -> Result<(), SerdeError> {
Ok(())
}
fn write_boolean(&mut self, _schema: &Schema, _value: bool) -> Result<(), SerdeError> {
Ok(())
}
fn write_byte(&mut self, _schema: &Schema, _value: i8) -> Result<(), SerdeError> {
Ok(())
}
fn write_short(&mut self, _schema: &Schema, _value: i16) -> Result<(), SerdeError> {
Ok(())
}
fn write_integer(&mut self, _schema: &Schema, _value: i32) -> Result<(), SerdeError> {
Ok(())
}
fn write_long(&mut self, _schema: &Schema, _value: i64) -> Result<(), SerdeError> {
Ok(())
}
fn write_float(&mut self, _schema: &Schema, _value: f32) -> Result<(), SerdeError> {
Ok(())
}
fn write_double(&mut self, _schema: &Schema, _value: f64) -> Result<(), SerdeError> {
Ok(())
}
fn write_big_integer(
&mut self,
_schema: &Schema,
_value: &aws_smithy_types::BigInteger,
) -> Result<(), SerdeError> {
Ok(())
}
fn write_big_decimal(
&mut self,
_schema: &Schema,
_value: &aws_smithy_types::BigDecimal,
) -> Result<(), SerdeError> {
Ok(())
}
fn write_string(&mut self, _schema: &Schema, _value: &str) -> Result<(), SerdeError> {
Ok(())
}
fn write_blob(
&mut self,
_schema: &Schema,
_value: &aws_smithy_types::Blob,
) -> Result<(), SerdeError> {
Ok(())
}
fn write_timestamp(
&mut self,
_schema: &Schema,
_value: &aws_smithy_types::DateTime,
) -> Result<(), SerdeError> {
Ok(())
}
fn write_document(
&mut self,
_schema: &Schema,
_value: &aws_smithy_types::Document,
) -> Result<(), SerdeError> {
Ok(())
}
fn write_null(&mut self, _schema: &Schema) -> Result<(), SerdeError> {
Ok(())
}
}
struct MockDeserializer<'a> {
#[allow(dead_code)]
input: &'a [u8],
}
impl<'a> ShapeDeserializer for MockDeserializer<'a> {
fn read_struct(
&mut self,
_schema: &Schema,
_consumer: &mut dyn FnMut(
&Schema,
&mut dyn ShapeDeserializer,
) -> Result<(), SerdeError>,
) -> Result<(), SerdeError> {
Ok(())
}
fn read_list(
&mut self,
_schema: &Schema,
_consumer: &mut dyn FnMut(&mut dyn ShapeDeserializer) -> Result<(), SerdeError>,
) -> Result<(), SerdeError> {
Ok(())
}
fn read_map(
&mut self,
_schema: &Schema,
_consumer: &mut dyn FnMut(String, &mut dyn ShapeDeserializer) -> Result<(), SerdeError>,
) -> Result<(), SerdeError> {
Ok(())
}
fn read_boolean(&mut self, _schema: &Schema) -> Result<bool, SerdeError> {
Ok(false)
}
fn read_byte(&mut self, _schema: &Schema) -> Result<i8, SerdeError> {
Ok(0)
}
fn read_short(&mut self, _schema: &Schema) -> Result<i16, SerdeError> {
Ok(0)
}
fn read_integer(&mut self, _schema: &Schema) -> Result<i32, SerdeError> {
Ok(0)
}
fn read_long(&mut self, _schema: &Schema) -> Result<i64, SerdeError> {
Ok(0)
}
fn read_float(&mut self, _schema: &Schema) -> Result<f32, SerdeError> {
Ok(0.0)
}
fn read_double(&mut self, _schema: &Schema) -> Result<f64, SerdeError> {
Ok(0.0)
}
fn read_big_integer(
&mut self,
_schema: &Schema,
) -> Result<aws_smithy_types::BigInteger, SerdeError> {
use std::str::FromStr;
Ok(aws_smithy_types::BigInteger::from_str("0").unwrap())
}
fn read_big_decimal(
&mut self,
_schema: &Schema,
) -> Result<aws_smithy_types::BigDecimal, SerdeError> {
use std::str::FromStr;
Ok(aws_smithy_types::BigDecimal::from_str("0").unwrap())
}
fn read_string(&mut self, _schema: &Schema) -> Result<String, SerdeError> {
Ok(String::new())
}
fn read_blob(&mut self, _schema: &Schema) -> Result<aws_smithy_types::Blob, SerdeError> {
Ok(aws_smithy_types::Blob::new(Vec::new()))
}
fn read_timestamp(
&mut self,
_schema: &Schema,
) -> Result<aws_smithy_types::DateTime, SerdeError> {
Ok(aws_smithy_types::DateTime::from_secs(0))
}
fn read_document(
&mut self,
_schema: &Schema,
) -> Result<aws_smithy_types::Document, SerdeError> {
Ok(aws_smithy_types::Document::Null)
}
fn is_null(&self) -> bool {
false
}
fn container_size(&self) -> Option<usize> {
None
}
}
struct MockCodec;
impl Codec for MockCodec {
type Serializer = MockSerializer;
type Deserializer<'a> = MockDeserializer<'a>;
fn create_serializer(&self) -> Self::Serializer {
MockSerializer { output: Vec::new() }
}
fn create_deserializer<'a>(&self, input: &'a [u8]) -> Self::Deserializer<'a> {
MockDeserializer { input }
}
}
#[test]
fn test_codec_create_serializer() {
let codec = MockCodec;
let mut serializer = codec.create_serializer();
serializer.write_string(&STRING, "test").unwrap();
let output = serializer.finish();
assert_eq!(output, Vec::<u8>::new());
}
#[test]
fn test_codec_create_deserializer() {
let codec = MockCodec;
let input = b"test data";
let mut deserializer = codec.create_deserializer(input);
let result = deserializer.read_string(&STRING).unwrap();
assert_eq!(result, "");
}
#[test]
fn test_codec_roundtrip() {
let codec = MockCodec;
let mut serializer = codec.create_serializer();
serializer.write_integer(&INTEGER, 42).unwrap();
let bytes = serializer.finish();
let mut deserializer = codec.create_deserializer(&bytes);
let value = deserializer.read_integer(&INTEGER).unwrap();
assert_eq!(value, 0); }
}