Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Improve service documentation #2020

Merged
merged 12 commits into from
Nov 25, 2022
45 changes: 45 additions & 0 deletions rust-runtime/aws-smithy-http-server/src/plugin/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,51 @@
* SPDX-License-Identifier: Apache-2.0
*/

//! The plugin system allows you to build middleware with an awareness of the operation it is applied to.
//!
//! The system centers around the [`Plugin`] trait. In addition, this module provides helpers for composing and
//! combining [`Plugin`]s.
//!
//! # Filtered application of a HTTP [`Layer`](tower::Layer)
//!
//! ```
//! # use aws_smithy_http_server::plugin::*;
//! # let layer = ();
//! // Create a `Plugin` from a HTTP `Layer`
//! let plugin = HttpLayer(layer);
//!
//! // Only apply the layer to operations with name "GetPokemonSpecies"
//! let plugin = filter_by_operation_name(plugin, |name| name == "GetPokemonSpecies");
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Let's use the ::NAME property on an operation ZST here.

//! ```
//!
//! # Construct [`Plugin`] from Operation name closure
hlbarber marked this conversation as resolved.
Show resolved Hide resolved
//!
//! ```
//! # use aws_smithy_http_server::plugin::*;
//! // A `tower::Layer` which requires the operation name
//! struct PrintLayer {
//! name: &'static str
//! }
//!
//! // Create a `Plugin` using `PrintLayer`
//! let plugin = plugin_from_operation_name_fn(|name| PrintLayer { name });
//! ```
//!
//! # Combine [`Plugin`]s
//!
//! ```
//! # use aws_smithy_http_server::plugin::*;
//! # let a = (); let b = ();
//! // Combine `Plugin`s `a` and `b`
//! let plugin = PluginPipeline::new()
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What's the order in which they will run?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good point, I'll document that

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

//! .push(a)
//! .push(b);
//! ```
//!
//! As noted in the [`PluginPipeline`] documentation, the plugins' runtime logic is executed in registration order,
//! meaning that `a` is run _before_ `b` in the example above.
//!

mod closure;
mod filter;
mod identity;
Expand Down
4 changes: 2 additions & 2 deletions rust-runtime/aws-smithy-http-server/src/request/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -119,8 +119,8 @@ impl<B> RequestParts<B> {
}
}

/// Provides a protocol aware extraction from a [`Request`]. This borrows the
/// [`Parts`], in contrast to [`FromRequest`].
// NOTE: We cannot reference `FromRequest` here, as a point of contrast, as it's `doc(hidden)`.
/// Provides a protocol aware extraction from a requests [`Parts`].
pub trait FromParts<Protocol>: Sized {
type Rejection: IntoResponse<Protocol>;

Expand Down
5 changes: 4 additions & 1 deletion rust-runtime/aws-smithy-http-server/src/routing/route.rs
Original file line number Diff line number Diff line change
Expand Up @@ -46,12 +46,15 @@ use tower::{
Service, ServiceExt,
};

/// How routes are stored inside a [`Router`](super::Router).
/// A HTTP [`Service`] representing a single route.
///
/// The construction of [`Route`] from a named HTTP [`Service`] S, erases the type of `S`.
hlbarber marked this conversation as resolved.
Show resolved Hide resolved
pub struct Route<B = Body> {
service: BoxCloneService<Request<B>, Response<BoxBody>, Infallible>,
}

impl<B> Route<B> {
/// Constructs a new [`Route`] from a well-formed HTTP service which is cloneable.
pub fn new<T>(svc: T) -> Self
where
T: Service<Request<B>, Response = Response<BoxBody>, Error = Infallible> + Clone + Send + 'static,
Expand Down