aws_smithy_runtime/client/test_util/
serializer.rs

1/*
2 * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3 * SPDX-License-Identifier: Apache-2.0
4 */
5
6use 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/// Test [`SerializeRequest`] that returns a canned request.
15#[derive(Default, Debug)]
16pub struct CannedRequestSerializer {
17    inner: Mutex<Option<Result<HttpRequest, BoxError>>>,
18}
19
20impl CannedRequestSerializer {
21    /// Create a new [`CannedRequestSerializer`] with a successful canned request.
22    pub fn success(request: HttpRequest) -> Self {
23        Self {
24            inner: Mutex::new(Some(Ok(request))),
25        }
26    }
27
28    /// Create a new [`CannedRequestSerializer`] with a canned error.
29    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}