/// A fast and customizable Rust implementation of the $serviceName Smithy service.
///
/// ## Using $serviceName
///
/// The primary entrypoint is [`$serviceName`]: it satisfies the [`Service<http::Request, Response = http::Response>`]
/// trait and therefore can be handed to a [`hyper` server] via [`$serviceName::into_make_service`] or used in Lambda via [`#{SmithyHttpServer}::routing::LambdaHandler`].
/// ## let app = $serviceName::builder_without_plugins().build_unchecked();
/// let handler = #{SmithyHttpServer}::routing::LambdaHandler::new(app);
/// lambda_http::run(handler).await.unwrap();
/// ## }
/// ```
///
/// ## Building the $serviceName
///
/// To construct [`$serviceName`] we use [`$builderName`] returned by [`$serviceName::builder_without_plugins`]
/// or [`$serviceName::builder_with_plugins`].
///
/// #### Plugins
///
/// The [`$serviceName::builder_with_plugins`] method, returning [`$builderName`],
/// accepts a [`Plugin`](aws_smithy_http_server::plugin::Plugin).
/// Plugins allow you to build middleware which is aware of the operation it is being applied to.
///
/// ```rust,ignore
/// ## use #{SmithyHttpServer}::plugin::IdentityPlugin as LoggingPlugin;
/// ## use #{SmithyHttpServer}::plugin::IdentityPlugin as MetricsPlugin;
/// ## use #{SmithyHttpServer}::plugin::PluginPipeline;
/// let plugins = PluginPipeline::new()
/// .push(LoggingPlugin)
/// .push(MetricsPlugin);
/// let builder = $crateName::$serviceName::builder_with_plugins(plugins);
/// ```
///
/// Check out [`#{SmithyHttpServer}::plugin`] to learn more about plugins.
///
/// #### Handlers
///
/// [`$builderName`] provides a setter method for each operation in your Smithy model. The setter methods expect an async function as input, matching the signature for the corresponding operation in your Smithy model.
/// We call these async functions **handlers**. This is where your application business logic lives.
///
/// Every handler must take an `Input`, and optional [`extractor arguments`](#{SmithyHttpServer}::request), while returning:
///
/// * A `Result<Output, Error>` if your operation has modeled errors, or
/// You can convert [`$builderName`] into [`$serviceName`] using either [`$builderName::build`] or [`$builderName::build_unchecked`].
///
/// [`$builderName::build`] requires you to provide a handler for every single operation in your Smithy model. It will return an error if that is not the case.
///
/// [`$builderName::build_unchecked`], instead, does not require exhaustiveness. The server will automatically return 500s to all requests for operations that do not have a registered handler.
/// [`$builderName::build_unchecked`] is particularly useful if you are deploying your Smithy service as a collection of Lambda functions, where each Lambda is only responsible for a subset of the operations in the Smithy service (or even a single one!).
///
/// ## Example
///
/// ```rust
/// use std::net::SocketAddr;
/// use $crateName::$serviceName;
///
/// ##[tokio::main]
/// pub async fn main() {
/// let app = $serviceName::builder_without_plugins()