use crate::box_error::BoxError;
use crate::client::interceptors::context::{Error, Input, Output};
use crate::client::orchestrator::{HttpRequest, HttpResponse, OrchestratorError};
use crate::impl_shared_conversions;
use aws_smithy_types::config_bag::{ConfigBag, Storable, StoreReplace};
use std::fmt;
use std::sync::Arc;
#[deprecated(note = "Renamed to SerializeRequest.")]
pub use SerializeRequest as RequestSerializer;
pub trait SerializeRequest: Send + Sync + fmt::Debug {
fn serialize_input(&self, input: Input, cfg: &mut ConfigBag) -> Result<HttpRequest, BoxError>;
}
#[derive(Clone, Debug)]
pub struct SharedRequestSerializer(Arc<dyn SerializeRequest>);
impl SharedRequestSerializer {
pub fn new(serializer: impl SerializeRequest + 'static) -> Self {
Self(Arc::new(serializer))
}
}
impl SerializeRequest for SharedRequestSerializer {
fn serialize_input(&self, input: Input, cfg: &mut ConfigBag) -> Result<HttpRequest, BoxError> {
self.0.serialize_input(input, cfg)
}
}
impl Storable for SharedRequestSerializer {
type Storer = StoreReplace<Self>;
}
impl_shared_conversions!(convert SharedRequestSerializer from SerializeRequest using SharedRequestSerializer::new);
#[deprecated(note = "Renamed to DeserializeResponse.")]
pub use DeserializeResponse as ResponseDeserializer;
pub trait DeserializeResponse: Send + Sync + fmt::Debug {
fn deserialize_streaming(
&self,
response: &mut HttpResponse,
) -> Option<Result<Output, OrchestratorError<Error>>> {
let _ = response;
None
}
fn deserialize_nonstreaming(
&self,
response: &HttpResponse,
) -> Result<Output, OrchestratorError<Error>>;
}
#[derive(Debug)]
pub struct SharedResponseDeserializer(Arc<dyn DeserializeResponse>);
impl SharedResponseDeserializer {
pub fn new(serializer: impl DeserializeResponse + 'static) -> Self {
Self(Arc::new(serializer))
}
}
impl DeserializeResponse for SharedResponseDeserializer {
fn deserialize_nonstreaming(
&self,
response: &HttpResponse,
) -> Result<Output, OrchestratorError<Error>> {
self.0.deserialize_nonstreaming(response)
}
fn deserialize_streaming(
&self,
response: &mut HttpResponse,
) -> Option<Result<Output, OrchestratorError<Error>>> {
self.0.deserialize_streaming(response)
}
}
impl Storable for SharedResponseDeserializer {
type Storer = StoreReplace<Self>;
}
impl_shared_conversions!(convert SharedResponseDeserializer from DeserializeResponse using SharedResponseDeserializer::new);