use super::error::SerdeError;
use crate::Schema;
use aws_smithy_types::{BigDecimal, BigInteger, Blob, DateTime, Document};
pub const MAX_CONTAINER_PREALLOC: usize = 10_000;
pub fn capped_container_size(raw: usize) -> usize {
raw.min(MAX_CONTAINER_PREALLOC)
}
pub trait ShapeDeserializer {
fn read_struct(
&mut self,
schema: &Schema,
state: &mut dyn FnMut(&Schema, &mut dyn ShapeDeserializer) -> Result<(), SerdeError>,
) -> Result<(), SerdeError>;
fn read_list(
&mut self,
schema: &Schema,
state: &mut dyn FnMut(&mut dyn ShapeDeserializer) -> Result<(), SerdeError>,
) -> Result<(), SerdeError>;
fn read_map(
&mut self,
schema: &Schema,
state: &mut dyn FnMut(String, &mut dyn ShapeDeserializer) -> Result<(), SerdeError>,
) -> Result<(), SerdeError>;
fn read_boolean(&mut self, schema: &Schema) -> Result<bool, SerdeError>;
fn read_byte(&mut self, schema: &Schema) -> Result<i8, SerdeError>;
fn read_short(&mut self, schema: &Schema) -> Result<i16, SerdeError>;
fn read_integer(&mut self, schema: &Schema) -> Result<i32, SerdeError>;
fn read_long(&mut self, schema: &Schema) -> Result<i64, SerdeError>;
fn read_float(&mut self, schema: &Schema) -> Result<f32, SerdeError>;
fn read_double(&mut self, schema: &Schema) -> Result<f64, SerdeError>;
fn read_big_integer(&mut self, schema: &Schema) -> Result<BigInteger, SerdeError>;
fn read_big_decimal(&mut self, schema: &Schema) -> Result<BigDecimal, SerdeError>;
fn read_string(&mut self, schema: &Schema) -> Result<String, SerdeError>;
fn read_blob(&mut self, schema: &Schema) -> Result<Blob, SerdeError>;
fn read_timestamp(&mut self, schema: &Schema) -> Result<DateTime, SerdeError>;
fn read_document(&mut self, schema: &Schema) -> Result<Document, SerdeError>;
fn is_null(&self) -> bool;
fn read_null(&mut self) -> Result<(), SerdeError> {
Ok(())
}
fn container_size(&self) -> Option<usize>;
fn read_string_list(&mut self, schema: &Schema) -> Result<Vec<String>, SerdeError> {
let mut out = Vec::new();
self.read_list(schema, &mut |deser| {
out.push(deser.read_string(schema)?);
Ok(())
})?;
Ok(out)
}
fn read_blob_list(
&mut self,
schema: &Schema,
) -> Result<Vec<aws_smithy_types::Blob>, SerdeError> {
let mut out = Vec::new();
self.read_list(schema, &mut |deser| {
out.push(deser.read_blob(schema)?);
Ok(())
})?;
Ok(out)
}
fn read_integer_list(&mut self, schema: &Schema) -> Result<Vec<i32>, SerdeError> {
let mut out = Vec::new();
self.read_list(schema, &mut |deser| {
out.push(deser.read_integer(schema)?);
Ok(())
})?;
Ok(out)
}
fn read_long_list(&mut self, schema: &Schema) -> Result<Vec<i64>, SerdeError> {
let mut out = Vec::new();
self.read_list(schema, &mut |deser| {
out.push(deser.read_long(schema)?);
Ok(())
})?;
Ok(out)
}
fn read_string_string_map(
&mut self,
schema: &Schema,
) -> Result<std::collections::HashMap<String, String>, SerdeError> {
let mut out = std::collections::HashMap::new();
self.read_map(schema, &mut |key, deser| {
out.insert(key, deser.read_string(schema)?);
Ok(())
})?;
Ok(out)
}
}