diff --git a/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/generators/client/FluentClientDecorator.kt b/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/generators/client/FluentClientDecorator.kt index 2d2e435e7e378ef6c0ccc815a5bb2fb429aac5b8..d70cdc56ff81883092e62dc81f4d9413c89c1c20 100644 --- a/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/generators/client/FluentClientDecorator.kt +++ b/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/generators/client/FluentClientDecorator.kt @@ -184,37 +184,77 @@ class GenericFluentClient(codegenContext: CodegenContext) : FluentClientCustomiz // Ignored as otherwise we'd need to pull in all these dev-dependencies. /// ```rust,ignore /// use aws_endpoint::AwsEndpointStage; + /// use aws_http::auth::CredentialsStage; + /// use aws_http::recursion_detection::RecursionDetectionStage; /// use aws_http::user_agent::UserAgentStage; /// use aws_sig_auth::middleware::SigV4SigningStage; /// use aws_sig_auth::signer::SigV4Signer; - /// use aws_smithy_http_tower::map_request::MapRequestLayer; - /// use tower::layer::util::Stack; + /// use aws_smithy_client::retry::Config as RetryConfig; + /// use aws_smithy_http_tower::map_request::{AsyncMapRequestLayer, MapRequestLayer}; + /// use std::fmt::Debug; + /// use tower::layer::util::{Identity, Stack}; /// use tower::ServiceBuilder; /// - /// type AwsMiddlewareStack = - /// Stack, - /// Stack, - /// MapRequestLayer>>, + /// type AwsMiddlewareStack = Stack< + /// MapRequestLayer, + /// Stack< + /// MapRequestLayer, + /// Stack< + /// AsyncMapRequestLayer, + /// Stack< + /// MapRequestLayer, + /// Stack, Identity>, + /// >, + /// >, + /// >, + /// >; /// - /// ##[derive(Debug, Default)] + /// /// AWS Middleware Stack + /// /// + /// /// This implements the middleware stack for this service. It will: + /// /// 1. Load credentials asynchronously into the property bag + /// /// 2. Sign the request with SigV4 + /// /// 3. Resolve an Endpoint for the request + /// /// 4. Add a user agent to the request + /// ##[derive(Debug, Default, Clone)] + /// ##[non_exhaustive] /// pub struct AwsMiddleware; + /// + /// impl AwsMiddleware { + /// /// Create a new `AwsMiddleware` stack + /// /// + /// /// Note: `AwsMiddleware` holds no state. + /// pub fn new() -> Self { + /// AwsMiddleware::default() + /// } + /// } + /// + /// // define the middleware stack in a non-generic location to reduce code bloat. + /// fn base() -> ServiceBuilder { + /// let credential_provider = AsyncMapRequestLayer::for_mapper(CredentialsStage::new()); + /// let signer = MapRequestLayer::for_mapper(SigV4SigningStage::new(SigV4Signer::new())); + /// let endpoint_resolver = MapRequestLayer::for_mapper(AwsEndpointStage); + /// let user_agent = MapRequestLayer::for_mapper(UserAgentStage::new()); + /// let recursion_detection = MapRequestLayer::for_mapper(RecursionDetectionStage::new()); + /// // These layers can be considered as occurring in order, that is: + /// // 1. Resolve an endpoint + /// // 2. Add a user agent + /// // 3. Acquire credentials + /// // 4. Sign with credentials + /// // (5. Dispatch over the wire) + /// ServiceBuilder::new() + /// .layer(endpoint_resolver) + /// .layer(user_agent) + /// .layer(credential_provider) + /// .layer(signer) + /// .layer(recursion_detection) + /// } + /// /// impl tower::Layer for AwsMiddleware { /// type Service = >::Service; /// /// fn layer(&self, inner: S) -> Self::Service { - /// let signer = MapRequestLayer::for_mapper(SigV4SigningStage::new(SigV4Signer::new())); _signer: MapRequestLaye - /// let endpoint_resolver = MapRequestLayer::for_mapper(AwsEndpointStage); _endpoint_resolver: MapRequestLayer - /// .layer(endpoint_resolver) _ServiceBuilder, _>> - /// .layer(user_agent) _ServiceBuilder, _>> - /// .layer(signer) _ServiceBuilder, _>> - /// .service(inner) + /// base().service(inner) /// } /// } /// ```