use super::error::SerdeError;
use crate::Schema;
use aws_smithy_types::Document;
use aws_smithy_types::{BigDecimal, BigInteger, Blob, DateTime};
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 element = schema.member().unwrap_or(&crate::prelude::STRING);
let mut out = Vec::new();
self.read_list(schema, &mut |deser| {
out.push(deser.read_string(element)?);
Ok(())
})?;
Ok(out)
}
fn read_blob_list(
&mut self,
schema: &Schema<'_>,
) -> Result<Vec<aws_smithy_types::Blob>, SerdeError> {
let element = schema.member().unwrap_or(&crate::prelude::BLOB);
let mut out = Vec::new();
self.read_list(schema, &mut |deser| {
out.push(deser.read_blob(element)?);
Ok(())
})?;
Ok(out)
}
fn read_integer_list(&mut self, schema: &Schema<'_>) -> Result<Vec<i32>, SerdeError> {
let element = schema.member().unwrap_or(&crate::prelude::INTEGER);
let mut out = Vec::new();
self.read_list(schema, &mut |deser| {
out.push(deser.read_integer(element)?);
Ok(())
})?;
Ok(out)
}
fn read_long_list(&mut self, schema: &Schema<'_>) -> Result<Vec<i64>, SerdeError> {
let element = schema.member().unwrap_or(&crate::prelude::LONG);
let mut out = Vec::new();
self.read_list(schema, &mut |deser| {
out.push(deser.read_long(element)?);
Ok(())
})?;
Ok(out)
}
fn read_string_string_map(
&mut self,
schema: &Schema<'_>,
) -> Result<std::collections::HashMap<String, String>, SerdeError> {
let value = schema.member().unwrap_or(&crate::prelude::STRING);
let mut out = std::collections::HashMap::new();
self.read_map(schema, &mut |key, deser| {
out.insert(key, deser.read_string(value)?);
Ok(())
})?;
Ok(out)
}
}