aws_smithy_runtime/client/test_util/
serializer.rs1use aws_smithy_runtime_api::box_error::BoxError;
7use aws_smithy_runtime_api::client::interceptors::context::Input;
8use aws_smithy_runtime_api::client::orchestrator::HttpRequest;
9use aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugin;
10use aws_smithy_runtime_api::client::ser_de::{SerializeRequest, SharedRequestSerializer};
11use aws_smithy_types::config_bag::{ConfigBag, FrozenLayer, Layer};
12use std::sync::Mutex;
13
14#[derive(Default, Debug)]
16pub struct CannedRequestSerializer {
17 inner: Mutex<Option<Result<HttpRequest, BoxError>>>,
18}
19
20impl CannedRequestSerializer {
21 pub fn success(request: HttpRequest) -> Self {
23 Self {
24 inner: Mutex::new(Some(Ok(request))),
25 }
26 }
27
28 pub fn failure(error: BoxError) -> Self {
30 Self {
31 inner: Mutex::new(Some(Err(error))),
32 }
33 }
34
35 fn take(&self) -> Option<Result<HttpRequest, BoxError>> {
36 match self.inner.lock() {
37 Ok(mut guard) => guard.take(),
38 Err(_) => None,
39 }
40 }
41}
42
43impl SerializeRequest for CannedRequestSerializer {
44 fn serialize_input(
45 &self,
46 _input: Input,
47 _cfg: &mut ConfigBag,
48 ) -> Result<HttpRequest, BoxError> {
49 self.take()
50 .ok_or("CannedRequestSerializer's inner value has already been taken.")?
51 }
52}
53
54impl RuntimePlugin for CannedRequestSerializer {
55 fn config(&self) -> Option<FrozenLayer> {
56 let mut cfg = Layer::new("CannedRequest");
57 cfg.store_put(SharedRequestSerializer::new(Self {
58 inner: Mutex::new(self.take()),
59 }));
60 Some(cfg.freeze())
61 }
62}