pub(crate) mod internal {
    pub type BoxFuture<T> = ::std::pin::Pin<::std::boxed::Box<dyn ::std::future::Future<Output = T> + ::std::marker::Send>>;
    pub type SendResult<T, E> =
        ::std::result::Result<T, ::aws_smithy_http::result::SdkError<E, ::aws_smithy_runtime_api::client::orchestrator::HttpResponse>>;
    pub trait CustomizableSend<T, E>: ::std::marker::Send + ::std::marker::Sync {
        fn send(self, config_override: crate::config::Builder) -> BoxFuture<SendResult<T, E>>;
    }
}
pub mod orchestrator {
    pub struct CustomizableOperation<T, E, B> {
        customizable_send: B,
        config_override: ::std::option::Option<crate::config::Builder>,
        interceptors: Vec<::aws_smithy_runtime_api::client::interceptors::SharedInterceptor>,
        runtime_plugins: Vec<::aws_smithy_runtime_api::client::runtime_plugin::SharedRuntimePlugin>,
        _output: ::std::marker::PhantomData<T>,
        _error: ::std::marker::PhantomData<E>,
    }
    impl<T, E, B> CustomizableOperation<T, E, B> {
        pub(crate) fn new(customizable_send: B) -> Self {
            Self {
                customizable_send,
                config_override: ::std::option::Option::None,
                interceptors: vec![],
                runtime_plugins: vec![],
                _output: ::std::marker::PhantomData,
                _error: ::std::marker::PhantomData,
            }
        }
        pub fn interceptor(mut self, interceptor: impl ::aws_smithy_runtime_api::client::interceptors::Interceptor + 'static) -> Self {
            self.interceptors
                .push(::aws_smithy_runtime_api::client::interceptors::SharedInterceptor::new(interceptor));
            self
        }
        #[allow(unused)]
        pub(crate) fn runtime_plugin(
            mut self,
            runtime_plugin: impl ::aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugin + 'static,
        ) -> Self {
            self.runtime_plugins
                .push(::aws_smithy_runtime_api::client::runtime_plugin::SharedRuntimePlugin::new(runtime_plugin));
            self
        }
        pub fn map_request<F, MapE>(mut self, f: F) -> Self
        where
            F: ::std::ops::Fn(
                    ::aws_smithy_runtime_api::client::orchestrator::HttpRequest,
                ) -> ::std::result::Result<::aws_smithy_runtime_api::client::orchestrator::HttpRequest, MapE>
                + ::std::marker::Send
                + ::std::marker::Sync
                + 'static,
            MapE: ::std::error::Error + ::std::marker::Send + ::std::marker::Sync + 'static,
        {
            self.interceptors
                .push(::aws_smithy_runtime_api::client::interceptors::SharedInterceptor::new(
                    ::aws_smithy_runtime::client::interceptors::MapRequestInterceptor::new(f),
                ));
            self
        }
        pub fn mutate_request<F>(mut self, f: F) -> Self
        where
            F: ::std::ops::Fn(&mut http::Request<::aws_smithy_http::body::SdkBody>) + ::std::marker::Send + ::std::marker::Sync + 'static,
        {
            self.interceptors
                .push(::aws_smithy_runtime_api::client::interceptors::SharedInterceptor::new(
                    ::aws_smithy_runtime::client::interceptors::MutateRequestInterceptor::new(f),
                ));
            self
        }
        pub fn config_override(mut self, config_override: impl ::std::convert::Into<crate::config::Builder>) -> Self {
            self.config_override = Some(config_override.into());
            self
        }
        pub async fn send(self) -> crate::client::customize::internal::SendResult<T, E>
        where
            E: std::error::Error + ::std::marker::Send + ::std::marker::Sync + 'static,
            B: crate::client::customize::internal::CustomizableSend<T, E>,
        {
            let mut config_override = if let Some(config_override) = self.config_override {
                config_override
            } else {
                crate::config::Builder::new()
            };
            self.interceptors.into_iter().for_each(|interceptor| {
                config_override.push_interceptor(interceptor);
            });
            self.runtime_plugins.into_iter().for_each(|plugin| {
                config_override.push_runtime_plugin(plugin);
            });
            self.customizable_send.send(config_override).await
        }
        #[doc(hidden)]
        pub fn request_time_for_tests(self, request_time: ::std::time::SystemTime) -> Self {
            self.runtime_plugin(
                ::aws_smithy_runtime_api::client::runtime_plugin::StaticRuntimePlugin::new().with_runtime_components(
                    ::aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder::new("request_time_for_tests").with_time_source(
                        Some(::aws_smithy_async::time::SharedTimeSource::new(
                            ::aws_smithy_async::time::StaticTimeSource::new(request_time),
                        )),
                    ),
                ),
            )
        }
        #[doc(hidden)]
        pub fn user_agent_for_tests(mut self) -> Self {
            let interceptor = crate::client::customize::TestParamsSetterInterceptor::new(
                |context: &mut ::aws_smithy_runtime_api::client::interceptors::context::BeforeTransmitInterceptorContextMut<'_>,
                 _: &mut ::aws_smithy_types::config_bag::ConfigBag| {
                    let headers = context.request_mut().headers_mut();
                    let user_agent = ::aws_http::user_agent::AwsUserAgent::for_tests();
                    headers.insert(::http::header::USER_AGENT, ::http::HeaderValue::try_from(user_agent.ua_header()).unwrap());
                    headers.insert(
                        ::http::HeaderName::from_static("x-amz-user-agent"),
                        ::http::HeaderValue::try_from(user_agent.aws_ua_header()).unwrap(),
                    );
                },
            );
            self.interceptors
                .push(::aws_smithy_runtime_api::client::interceptors::SharedInterceptor::new(interceptor));
            self
        }
        #[doc(hidden)]
        pub fn remove_invocation_id_for_tests(mut self) -> Self {
            let interceptor = crate::client::customize::TestParamsSetterInterceptor::new(
                |context: &mut ::aws_smithy_runtime_api::client::interceptors::context::BeforeTransmitInterceptorContextMut<'_>,
                 _: &mut ::aws_smithy_types::config_bag::ConfigBag| {
                    context.request_mut().headers_mut().remove("amz-sdk-invocation-id");
                },
            );
            self.interceptors
                .push(::aws_smithy_runtime_api::client::interceptors::SharedInterceptor::new(interceptor));
            self
        }
    }
}
mod test_params_setter_interceptor {
    use aws_smithy_runtime_api::box_error::BoxError;
    use aws_smithy_runtime_api::client::interceptors::context::BeforeTransmitInterceptorContextMut;
    use aws_smithy_runtime_api::client::interceptors::Interceptor;
    use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents;
    use aws_smithy_types::config_bag::ConfigBag;
    use std::fmt;
    pub(super) struct TestParamsSetterInterceptor<F> {
        f: F,
    }
    impl<F> fmt::Debug for TestParamsSetterInterceptor<F> {
        fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
            write!(f, "TestParamsSetterInterceptor")
        }
    }
    impl<F> TestParamsSetterInterceptor<F> {
        pub fn new(f: F) -> Self {
            Self { f }
        }
    }
    impl<F> Interceptor for TestParamsSetterInterceptor<F>
    where
        F: Fn(&mut BeforeTransmitInterceptorContextMut<'_>, &mut ConfigBag) + Send + Sync + 'static,
    {
        fn name(&self) -> &'static str {
            "TestParamsSetterInterceptor"
        }
        fn modify_before_signing(
            &self,
            context: &mut BeforeTransmitInterceptorContextMut<'_>,
            _runtime_components: &RuntimeComponents,
            cfg: &mut ConfigBag,
        ) -> Result<(), BoxError> {
            (self.f)(context, cfg);
            Ok(())
        }
    }
}
use test_params_setter_interceptor::TestParamsSetterInterceptor;