Struct Router
pub struct Router<State = (), Layer = DefaultEndpointLayer, O = Response, E = RouterError> { /* private fields */ }http and std only.Expand description
A basic router that can be used to route requests to different services based on the request path.
Each route compiles to a PathPattern; on lookup the most-specific
matching pattern wins (static segments beat captures beat catch-alls).
Nested services are mounted under a prefix via a typed PathRouter.
Path matching uses PathMatchPolicy::default unless an explicit policy
is selected at construction with Router::new_with_path_match_policy or
Router::new_with_state_and_path_match_policy.
Routers created by Router::with_sub_router_make_fn inherit that policy.
A separately constructed router passed to Router::with_sub_service
retains its own policy; the parent policy still governs its mount prefix.
use rama_http::service::web::{PathMatchPolicy, Router};
let default_router: Router = Router::new();
assert_eq!(default_router.path_match_policy(), PathMatchPolicy::default());
let strict_router: Router =
Router::new_with_path_match_policy(PathMatchPolicy::STRICT);
assert_eq!(strict_router.path_match_policy(), PathMatchPolicy::STRICT);Implementations§
§impl<O, E> Router<(), DefaultEndpointLayer, O, E>
impl<O, E> Router<(), DefaultEndpointLayer, O, E>
pub fn new() -> Router<(), DefaultEndpointLayer, O, E>
pub fn new() -> Router<(), DefaultEndpointLayer, O, E>
create a new router.
pub fn new_with_path_match_policy(
path_match_policy: PathMatchPolicy,
) -> Router<(), DefaultEndpointLayer, O, E>
pub fn new_with_path_match_policy( path_match_policy: PathMatchPolicy, ) -> Router<(), DefaultEndpointLayer, O, E>
Create a new router with an explicit path-matching policy.
The policy applies consistently to ordinary routes, fallback routes, captures, wildcards, and mounted prefixes.
§impl<State, O, E> Router<State, DefaultEndpointLayer, O, E>
impl<State, O, E> Router<State, DefaultEndpointLayer, O, E>
pub fn new_with_state(state: State) -> Router<State, DefaultEndpointLayer, O, E>
pub fn new_with_state(state: State) -> Router<State, DefaultEndpointLayer, O, E>
Create a new router with state
pub fn new_with_state_and_path_match_policy(
state: State,
path_match_policy: PathMatchPolicy,
) -> Router<State, DefaultEndpointLayer, O, E>
pub fn new_with_state_and_path_match_policy( state: State, path_match_policy: PathMatchPolicy, ) -> Router<State, DefaultEndpointLayer, O, E>
Create a new router with state and an explicit path-matching policy.
The policy applies consistently to ordinary routes, fallback routes, captures, wildcards, and mounted prefixes.
§impl<State, L, O, E> Router<State, L, O, E>
impl<State, L, O, E> Router<State, L, O, E>
pub const fn path_match_policy(&self) -> PathMatchPolicy
pub const fn path_match_policy(&self) -> PathMatchPolicy
Return the immutable path-matching policy selected at construction.
pub fn with_endpoint_layer<N>(self, layer: N) -> Router<State, N, O, E>
pub fn with_endpoint_layer<N>(self, layer: N) -> Router<State, N, O, E>
Apply layer to every endpoint registered after this call.
Routes registered before this call keep whatever layer was in effect at the time of registration.
pub fn with_default_endpoint_layer(
self,
) -> Router<State, DefaultEndpointLayer, O, E>
pub fn with_default_endpoint_layer( self, ) -> Router<State, DefaultEndpointLayer, O, E>
Apply DefaultEndpointLayer to every endpoint registered after this call.
Routes registered before this call keep whatever layer was in effect at the time of registration.
pub fn with_get<I, T>(
self,
path: impl AsRef<str>,
service: I,
) -> Router<State, L, O, E>where
I: IntoEndpointServiceWithState<T, State>,
L: Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>,
<L as Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>>::Service: Service<Request, Output = O, Error = E>,
pub fn with_get<I, T>(
self,
path: impl AsRef<str>,
service: I,
) -> Router<State, L, O, E>where
I: IntoEndpointServiceWithState<T, State>,
L: Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>,
<L as Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>>::Service: Service<Request, Output = O, Error = E>,
add a GET route to the router.
the path can contain parameters, e.g. /users/{id}.
the path can also contain a catch call, e.g. /assets/{*path}.
pub fn set_get<I, T>(
&mut self,
path: impl AsRef<str>,
service: I,
) -> &mut Router<State, L, O, E>where
I: IntoEndpointServiceWithState<T, State>,
L: Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>,
<L as Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>>::Service: Service<Request, Output = O, Error = E>,
pub fn set_get<I, T>(
&mut self,
path: impl AsRef<str>,
service: I,
) -> &mut Router<State, L, O, E>where
I: IntoEndpointServiceWithState<T, State>,
L: Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>,
<L as Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>>::Service: Service<Request, Output = O, Error = E>,
add a GET route to the router.
the path can contain parameters, e.g. /users/{id}.
the path can also contain a catch call, e.g. /assets/{*path}.
pub fn with_post<I, T>(
self,
path: impl AsRef<str>,
service: I,
) -> Router<State, L, O, E>where
I: IntoEndpointServiceWithState<T, State>,
L: Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>,
<L as Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>>::Service: Service<Request, Output = O, Error = E>,
pub fn with_post<I, T>(
self,
path: impl AsRef<str>,
service: I,
) -> Router<State, L, O, E>where
I: IntoEndpointServiceWithState<T, State>,
L: Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>,
<L as Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>>::Service: Service<Request, Output = O, Error = E>,
add a POST route to the router.
pub fn set_post<I, T>(
&mut self,
path: impl AsRef<str>,
service: I,
) -> &mut Router<State, L, O, E>where
I: IntoEndpointServiceWithState<T, State>,
L: Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>,
<L as Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>>::Service: Service<Request, Output = O, Error = E>,
pub fn set_post<I, T>(
&mut self,
path: impl AsRef<str>,
service: I,
) -> &mut Router<State, L, O, E>where
I: IntoEndpointServiceWithState<T, State>,
L: Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>,
<L as Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>>::Service: Service<Request, Output = O, Error = E>,
add a POST route to the router.
pub fn with_put<I, T>(
self,
path: impl AsRef<str>,
service: I,
) -> Router<State, L, O, E>where
I: IntoEndpointServiceWithState<T, State>,
L: Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>,
<L as Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>>::Service: Service<Request, Output = O, Error = E>,
pub fn with_put<I, T>(
self,
path: impl AsRef<str>,
service: I,
) -> Router<State, L, O, E>where
I: IntoEndpointServiceWithState<T, State>,
L: Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>,
<L as Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>>::Service: Service<Request, Output = O, Error = E>,
add a PUT route to the router.
pub fn set_put<I, T>(
&mut self,
path: impl AsRef<str>,
service: I,
) -> &mut Router<State, L, O, E>where
I: IntoEndpointServiceWithState<T, State>,
L: Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>,
<L as Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>>::Service: Service<Request, Output = O, Error = E>,
pub fn set_put<I, T>(
&mut self,
path: impl AsRef<str>,
service: I,
) -> &mut Router<State, L, O, E>where
I: IntoEndpointServiceWithState<T, State>,
L: Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>,
<L as Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>>::Service: Service<Request, Output = O, Error = E>,
add a PUT route to the router.
pub fn with_delete<I, T>(
self,
path: impl AsRef<str>,
service: I,
) -> Router<State, L, O, E>where
I: IntoEndpointServiceWithState<T, State>,
L: Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>,
<L as Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>>::Service: Service<Request, Output = O, Error = E>,
pub fn with_delete<I, T>(
self,
path: impl AsRef<str>,
service: I,
) -> Router<State, L, O, E>where
I: IntoEndpointServiceWithState<T, State>,
L: Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>,
<L as Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>>::Service: Service<Request, Output = O, Error = E>,
add a DELETE route to the router.
pub fn set_delete<I, T>(
&mut self,
path: impl AsRef<str>,
service: I,
) -> &mut Router<State, L, O, E>where
I: IntoEndpointServiceWithState<T, State>,
L: Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>,
<L as Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>>::Service: Service<Request, Output = O, Error = E>,
pub fn set_delete<I, T>(
&mut self,
path: impl AsRef<str>,
service: I,
) -> &mut Router<State, L, O, E>where
I: IntoEndpointServiceWithState<T, State>,
L: Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>,
<L as Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>>::Service: Service<Request, Output = O, Error = E>,
add a DELETE route to the router.
pub fn with_patch<I, T>(
self,
path: impl AsRef<str>,
service: I,
) -> Router<State, L, O, E>where
I: IntoEndpointServiceWithState<T, State>,
L: Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>,
<L as Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>>::Service: Service<Request, Output = O, Error = E>,
pub fn with_patch<I, T>(
self,
path: impl AsRef<str>,
service: I,
) -> Router<State, L, O, E>where
I: IntoEndpointServiceWithState<T, State>,
L: Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>,
<L as Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>>::Service: Service<Request, Output = O, Error = E>,
add a PATCH route to the router.
pub fn set_patch<I, T>(
&mut self,
path: impl AsRef<str>,
service: I,
) -> &mut Router<State, L, O, E>where
I: IntoEndpointServiceWithState<T, State>,
L: Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>,
<L as Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>>::Service: Service<Request, Output = O, Error = E>,
pub fn set_patch<I, T>(
&mut self,
path: impl AsRef<str>,
service: I,
) -> &mut Router<State, L, O, E>where
I: IntoEndpointServiceWithState<T, State>,
L: Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>,
<L as Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>>::Service: Service<Request, Output = O, Error = E>,
add a PATCH route to the router.
pub fn with_head<I, T>(
self,
path: impl AsRef<str>,
service: I,
) -> Router<State, L, O, E>where
I: IntoEndpointServiceWithState<T, State>,
L: Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>,
<L as Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>>::Service: Service<Request, Output = O, Error = E>,
pub fn with_head<I, T>(
self,
path: impl AsRef<str>,
service: I,
) -> Router<State, L, O, E>where
I: IntoEndpointServiceWithState<T, State>,
L: Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>,
<L as Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>>::Service: Service<Request, Output = O, Error = E>,
add a HEAD route to the router.
pub fn set_head<I, T>(
&mut self,
path: impl AsRef<str>,
service: I,
) -> &mut Router<State, L, O, E>where
I: IntoEndpointServiceWithState<T, State>,
L: Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>,
<L as Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>>::Service: Service<Request, Output = O, Error = E>,
pub fn set_head<I, T>(
&mut self,
path: impl AsRef<str>,
service: I,
) -> &mut Router<State, L, O, E>where
I: IntoEndpointServiceWithState<T, State>,
L: Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>,
<L as Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>>::Service: Service<Request, Output = O, Error = E>,
add a HEAD route to the router.
pub fn with_options<I, T>(
self,
path: impl AsRef<str>,
service: I,
) -> Router<State, L, O, E>where
I: IntoEndpointServiceWithState<T, State>,
L: Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>,
<L as Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>>::Service: Service<Request, Output = O, Error = E>,
pub fn with_options<I, T>(
self,
path: impl AsRef<str>,
service: I,
) -> Router<State, L, O, E>where
I: IntoEndpointServiceWithState<T, State>,
L: Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>,
<L as Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>>::Service: Service<Request, Output = O, Error = E>,
add a OPTIONS route to the router.
pub fn set_options<I, T>(
&mut self,
path: impl AsRef<str>,
service: I,
) -> &mut Router<State, L, O, E>where
I: IntoEndpointServiceWithState<T, State>,
L: Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>,
<L as Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>>::Service: Service<Request, Output = O, Error = E>,
pub fn set_options<I, T>(
&mut self,
path: impl AsRef<str>,
service: I,
) -> &mut Router<State, L, O, E>where
I: IntoEndpointServiceWithState<T, State>,
L: Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>,
<L as Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>>::Service: Service<Request, Output = O, Error = E>,
add a OPTIONS route to the router.
pub fn with_trace<I, T>(
self,
path: impl AsRef<str>,
service: I,
) -> Router<State, L, O, E>where
I: IntoEndpointServiceWithState<T, State>,
L: Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>,
<L as Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>>::Service: Service<Request, Output = O, Error = E>,
pub fn with_trace<I, T>(
self,
path: impl AsRef<str>,
service: I,
) -> Router<State, L, O, E>where
I: IntoEndpointServiceWithState<T, State>,
L: Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>,
<L as Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>>::Service: Service<Request, Output = O, Error = E>,
add a TRACE route to the router.
pub fn set_trace<I, T>(
&mut self,
path: impl AsRef<str>,
service: I,
) -> &mut Router<State, L, O, E>where
I: IntoEndpointServiceWithState<T, State>,
L: Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>,
<L as Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>>::Service: Service<Request, Output = O, Error = E>,
pub fn set_trace<I, T>(
&mut self,
path: impl AsRef<str>,
service: I,
) -> &mut Router<State, L, O, E>where
I: IntoEndpointServiceWithState<T, State>,
L: Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>,
<L as Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>>::Service: Service<Request, Output = O, Error = E>,
add a TRACE route to the router.
pub fn with_connect<I, T>(
self,
path: impl AsRef<str>,
service: I,
) -> Router<State, L, O, E>where
I: IntoEndpointServiceWithState<T, State>,
L: Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>,
<L as Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>>::Service: Service<Request, Output = O, Error = E>,
pub fn with_connect<I, T>(
self,
path: impl AsRef<str>,
service: I,
) -> Router<State, L, O, E>where
I: IntoEndpointServiceWithState<T, State>,
L: Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>,
<L as Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>>::Service: Service<Request, Output = O, Error = E>,
add a CONNECT route to the router.
pub fn set_connect<I, T>(
&mut self,
path: impl AsRef<str>,
service: I,
) -> &mut Router<State, L, O, E>where
I: IntoEndpointServiceWithState<T, State>,
L: Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>,
<L as Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>>::Service: Service<Request, Output = O, Error = E>,
pub fn set_connect<I, T>(
&mut self,
path: impl AsRef<str>,
service: I,
) -> &mut Router<State, L, O, E>where
I: IntoEndpointServiceWithState<T, State>,
L: Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>,
<L as Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>>::Service: Service<Request, Output = O, Error = E>,
add a CONNECT route to the router.
pub fn with_query<I, T>(
self,
path: impl AsRef<str>,
service: I,
) -> Router<State, L, O, E>where
I: IntoEndpointServiceWithState<T, State>,
L: Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>,
<L as Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>>::Service: Service<Request, Output = O, Error = E>,
pub fn with_query<I, T>(
self,
path: impl AsRef<str>,
service: I,
) -> Router<State, L, O, E>where
I: IntoEndpointServiceWithState<T, State>,
L: Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>,
<L as Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>>::Service: Service<Request, Output = O, Error = E>,
add a QUERY route to the router.
QUERY (RFC 10008) is a safe, idempotent method whose request content defines the query.
pub fn set_query<I, T>(
&mut self,
path: impl AsRef<str>,
service: I,
) -> &mut Router<State, L, O, E>where
I: IntoEndpointServiceWithState<T, State>,
L: Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>,
<L as Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>>::Service: Service<Request, Output = O, Error = E>,
pub fn set_query<I, T>(
&mut self,
path: impl AsRef<str>,
service: I,
) -> &mut Router<State, L, O, E>where
I: IntoEndpointServiceWithState<T, State>,
L: Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>,
<L as Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>>::Service: Service<Request, Output = O, Error = E>,
add a QUERY route to the router.
pub fn with_sub_router_make_fn<Layer>(
self,
prefix: impl AsRef<str>,
configure_router: impl FnOnce(Router<State, L, O, E>) -> Router<State, Layer, O, E>,
) -> Router<State, L, O, E>
pub fn with_sub_router_make_fn<Layer>( self, prefix: impl AsRef<str>, configure_router: impl FnOnce(Router<State, L, O, E>) -> Router<State, Layer, O, E>, ) -> Router<State, L, O, E>
register a nested router under a prefix (path).
The prefix is used to match the request path and strip it from the request URI.
Note: this sub-router is configured with the same State this router has.
pub fn set_sub_router_make_fn<Layer>(
&mut self,
prefix: impl AsRef<str>,
configure_router: impl FnOnce(Router<State, L, O, E>) -> Router<State, Layer, O, E>,
) -> &mut Router<State, L, O, E>
pub fn set_sub_router_make_fn<Layer>( &mut self, prefix: impl AsRef<str>, configure_router: impl FnOnce(Router<State, L, O, E>) -> Router<State, Layer, O, E>, ) -> &mut Router<State, L, O, E>
register a nested router under a prefix (path).
The prefix is used to match the request path and strip it from the request URI.
Note: this sub-router is configured with the same State this router has.
pub fn with_endpoint_service<I, T>(
self,
prefix: impl AsRef<str>,
service: I,
) -> Router<State, L, O, E>where
I: IntoEndpointService<T>,
L: Layer<<I as IntoEndpointService<T>>::Service>,
<L as Layer<<I as IntoEndpointService<T>>::Service>>::Service: Service<Request, Output = O, Error = E>,
pub fn with_endpoint_service<I, T>(
self,
prefix: impl AsRef<str>,
service: I,
) -> Router<State, L, O, E>where
I: IntoEndpointService<T>,
L: Layer<<I as IntoEndpointService<T>>::Service>,
<L as Layer<<I as IntoEndpointService<T>>::Service>>::Service: Service<Request, Output = O, Error = E>,
Register a nested endpoint service under a prefix (path).
The prefix is used to match the request path and strip it from the request URI. Endpoint layer is applied to this sub-service.
Warning: If a sub-service is a plain Service, not an endpoint function,
it has no notion of the state this router has. If you want to create a sub-router
that shares the same state this router has, use Router::with_sub_router_make_fn instead.
pub fn set_endpoint_service<I, T>(
&mut self,
prefix: impl AsRef<str>,
service: I,
) -> &mut Router<State, L, O, E>where
I: IntoEndpointService<T>,
L: Layer<<I as IntoEndpointService<T>>::Service>,
<L as Layer<<I as IntoEndpointService<T>>::Service>>::Service: Service<Request, Output = O, Error = E>,
pub fn set_endpoint_service<I, T>(
&mut self,
prefix: impl AsRef<str>,
service: I,
) -> &mut Router<State, L, O, E>where
I: IntoEndpointService<T>,
L: Layer<<I as IntoEndpointService<T>>::Service>,
<L as Layer<<I as IntoEndpointService<T>>::Service>>::Service: Service<Request, Output = O, Error = E>,
Register a nested endpoint service under a prefix (path).
The prefix is used to match the request path and strip it from the request URI. Endpoint layer is applied to this sub-service.
Warning: If a sub-service is a plain Service, not an endpoint function,
it has no notion of the state this router has. If you want to create a sub-router
that shares the same state this router has, use Router::with_sub_router_make_fn instead.
pub fn with_sub_service<S>(
self,
prefix: impl AsRef<str>,
service: S,
) -> Router<State, L, O, E>
pub fn with_sub_service<S>( self, prefix: impl AsRef<str>, service: S, ) -> Router<State, L, O, E>
Register a nested service under a prefix (path).
The prefix is used to match the request path and strip it from the request URI.
Warning: This sub-service has no notion of the state this router has. If you want
to create a sub-router that shares the same state this router has, use Router::with_sub_router_make_fn instead.
Also, the endpoint layer is not applied to it, so its Output / Error must match those of the Router
If you need its type conversions, consider Router::with_endpoint_service
A separately constructed Router used as the service retains its own
path policy. This router’s policy applies only to the mount prefix.
pub fn set_sub_service<S>(
&mut self,
prefix: impl AsRef<str>,
service: S,
) -> &mut Router<State, L, O, E>
pub fn set_sub_service<S>( &mut self, prefix: impl AsRef<str>, service: S, ) -> &mut Router<State, L, O, E>
Register a nested service under a prefix.
The prefix is used to match the request path and strip it from the request URI.
Warning: This sub-service has no notion of the state this router has. If you want
to create a sub-router that shares the same state this router has, use Router::with_sub_router_make_fn instead.
Also, the endpoint layer is not applied to it, so its Output / Error must match those of the Router
If you need its type conversions, consider Router::set_endpoint_service
pub fn with_match_route<I, T>(
self,
path: impl AsRef<str>,
matcher: HttpMatcher<Body>,
service: I,
) -> Router<State, L, O, E>where
I: IntoEndpointServiceWithState<T, State>,
L: Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>,
<L as Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>>::Service: Service<Request, Output = O, Error = E>,
pub fn with_match_route<I, T>(
self,
path: impl AsRef<str>,
matcher: HttpMatcher<Body>,
service: I,
) -> Router<State, L, O, E>where
I: IntoEndpointServiceWithState<T, State>,
L: Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>,
<L as Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>>::Service: Service<Request, Output = O, Error = E>,
Add a route to the router with its matcher and service.
The route path uses the router’s policy. Any path patterns inside
matcher retain the policy explicitly selected for that matcher.
pub fn set_match_route<I, T>(
&mut self,
path: impl AsRef<str>,
matcher: HttpMatcher<Body>,
service: I,
) -> &mut Router<State, L, O, E>where
I: IntoEndpointServiceWithState<T, State>,
L: Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>,
<L as Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>>::Service: Service<Request, Output = O, Error = E>,
pub fn set_match_route<I, T>(
&mut self,
path: impl AsRef<str>,
matcher: HttpMatcher<Body>,
service: I,
) -> &mut Router<State, L, O, E>where
I: IntoEndpointServiceWithState<T, State>,
L: Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>,
<L as Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>>::Service: Service<Request, Output = O, Error = E>,
Add a route to the router with its matcher and service.
The route path uses the router’s policy. Any path patterns inside
matcher retain the policy explicitly selected for that matcher.
pub fn with_fallback_match_route<I, T>(
self,
path: impl AsRef<str>,
matcher: HttpMatcher<Body>,
service: I,
) -> Router<State, L, O, E>where
I: IntoEndpointServiceWithState<T, State>,
L: Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>,
<L as Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>>::Service: Service<Request, Output = O, Error = E>,
pub fn with_fallback_match_route<I, T>(
self,
path: impl AsRef<str>,
matcher: HttpMatcher<Body>,
service: I,
) -> Router<State, L, O, E>where
I: IntoEndpointServiceWithState<T, State>,
L: Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>,
<L as Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>>::Service: Service<Request, Output = O, Error = E>,
Add a route fallback evaluated after ordinary handlers and mounted sub-services for the same request path.
This is useful for protocol-specific error responses that must not
shadow another handler sharing the path. A matching fallback runs only
when no ordinary handler or mounted sub-service accepted the request,
and before the router produces its generic 405 or 404 response.
The fallback path uses the router’s policy; path patterns inside
matcher retain their own explicitly selected policy.
pub fn set_fallback_match_route<I, T>(
&mut self,
path: impl AsRef<str>,
matcher: HttpMatcher<Body>,
service: I,
) -> &mut Router<State, L, O, E>where
I: IntoEndpointServiceWithState<T, State>,
L: Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>,
<L as Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>>::Service: Service<Request, Output = O, Error = E>,
pub fn set_fallback_match_route<I, T>(
&mut self,
path: impl AsRef<str>,
matcher: HttpMatcher<Body>,
service: I,
) -> &mut Router<State, L, O, E>where
I: IntoEndpointServiceWithState<T, State>,
L: Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>,
<L as Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>>::Service: Service<Request, Output = O, Error = E>,
Add a route fallback evaluated after ordinary handlers and mounted sub-services for the same request path.
The fallback path uses the router’s policy; path patterns inside
matcher retain their own explicitly selected policy.
pub fn with_not_found<I, T>(self, service: I) -> Router<State, L, O, E>where
I: IntoEndpointServiceWithState<T, State>,
L: Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>,
<L as Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>>::Service: Service<Request, Output = O, Error = E>,
pub fn with_not_found<I, T>(self, service: I) -> Router<State, L, O, E>where
I: IntoEndpointServiceWithState<T, State>,
L: Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>,
<L as Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>>::Service: Service<Request, Output = O, Error = E>,
use the provided service when no route matches the request.
pub fn set_not_found<I, T>(&mut self, service: I) -> &mut Router<State, L, O, E>where
I: IntoEndpointServiceWithState<T, State>,
L: Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>,
<L as Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>>::Service: Service<Request, Output = O, Error = E>,
pub fn set_not_found<I, T>(&mut self, service: I) -> &mut Router<State, L, O, E>where
I: IntoEndpointServiceWithState<T, State>,
L: Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>,
<L as Layer<<I as IntoEndpointServiceWithState<T, State>>::Service>>::Service: Service<Request, Output = O, Error = E>,
use the provided service when no route matches the request.
Trait Implementations§
§impl<State, L, O, E> RouterExt<State, L, O, E> for Router<State, L, O, E>
impl<State, L, O, E> RouterExt<State, L, O, E> for Router<State, L, O, E>
§fn with_grpc_service<S>(self, service: S) -> Router<State, L, O, E>
fn with_grpc_service<S>(self, service: S) -> Router<State, L, O, E>
§fn set_grpc_service<S>(&mut self, service: S) -> &mut Router<State, L, O, E>
fn set_grpc_service<S>(&mut self, service: S) -> &mut Router<State, L, O, E>
§impl<State, L, O, E> Service<Request> for Router<State, L, O, E>
impl<State, L, O, E> Service<Request> for Router<State, L, O, E>
§async fn serve(
&self,
req: Request,
) -> Result<<Router<State, L, O, E> as Service<Request>>::Output, <Router<State, L, O, E> as Service<Request>>::Error>
async fn serve( &self, req: Request, ) -> Result<<Router<State, L, O, E> as Service<Request>>::Output, <Router<State, L, O, E> as Service<Request>>::Error>
§fn boxed(self) -> BoxService<Input, Self::Output, Self::Error>
fn boxed(self) -> BoxService<Input, Self::Output, Self::Error>
Auto Trait Implementations§
impl<State = (), Layer = DefaultEndpointLayer, O = Response, E = RouterError> !RefUnwindSafe for Router<State, Layer, O, E>
impl<State = (), Layer = DefaultEndpointLayer, O = Response, E = RouterError> !UnwindSafe for Router<State, Layer, O, E>
impl<State, Layer, O, E> Freeze for Router<State, Layer, O, E>
impl<State, Layer, O, E> Send for Router<State, Layer, O, E>
impl<State, Layer, O, E> Sync for Router<State, Layer, O, E>
impl<State, Layer, O, E> Unpin for Router<State, Layer, O, E>
impl<State, Layer, O, E> UnsafeUnpin for Router<State, Layer, O, E>where
Vec<RouteEntry<O, E>>: UnsafeUnpin,
Option<PathRouter<SubService<O, E>>>: UnsafeUnpin,
Option<BoxService<Request, O, E>>: UnsafeUnpin,
Layer: UnsafeUnpin,
State: UnsafeUnpin,
Blanket Implementations§
§impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
§impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
§impl<S, Input, Connection> ConnectorService<Input> for Swhere
S: Service<Input, Output = EstablishedClientConnection<Connection, Input>>,
<S as Service<Input>>::Error: Into<ConnectionError>,
Connection: Send + ExtensionsRef,
impl<S, Input, Connection> ConnectorService<Input> for Swhere
S: Service<Input, Output = EstablishedClientConnection<Connection, Input>>,
<S as Service<Input>>::Error: Into<ConnectionError>,
Connection: Send + ExtensionsRef,
§type Connection = Connection
type Connection = Connection
ConnectorService§fn connect(
&self,
input: Input,
) -> impl Future<Output = Result<EstablishedClientConnection<<S as ConnectorService<Input>>::Connection, Input>, ConnectionError>> + Send
fn connect( &self, input: Input, ) -> impl Future<Output = Result<EstablishedClientConnection<<S as ConnectorService<Input>>::Connection, Input>, ConnectionError>> + Send
§impl<T> FutureExt for T
impl<T> FutureExt for T
§fn with_context(self, otel_cx: Context) -> WithContext<Self> ⓘ
fn with_context(self, otel_cx: Context) -> WithContext<Self> ⓘ
§fn with_current_context(self) -> WithContext<Self> ⓘ
fn with_current_context(self) -> WithContext<Self> ⓘ
§impl<T, ReqBody, ResBody> GrpcService<ReqBody> for T
impl<T, ReqBody, ResBody> GrpcService<ReqBody> for T
§type ResponseBody = ResBody
type ResponseBody = ResBody
§fn serve(
&self,
request: Request<ReqBody>,
) -> impl Future<Output = Result<Response<<T as GrpcService<ReqBody>>::ResponseBody>, <T as GrpcService<ReqBody>>::Error>> + Send
fn serve( &self, request: Request<ReqBody>, ) -> impl Future<Output = Result<Response<<T as GrpcService<ReqBody>>::ResponseBody>, <T as GrpcService<ReqBody>>::Error>> + Send
§impl<S, Body> HttpClientExt for S
impl<S, Body> HttpClientExt for S
§type ExecuteResponse = Response<Body>
type ExecuteResponse = Response<Body>
execute method.§type ExecuteError = <S as Service<Request>>::Error
type ExecuteError = <S as Service<Request>>::Error
execute method.§fn get(
&self,
url: impl IntoUrl,
) -> RequestBuilder<'_, S, <S as HttpClientExt>::ExecuteResponse>
fn get( &self, url: impl IntoUrl, ) -> RequestBuilder<'_, S, <S as HttpClientExt>::ExecuteResponse>
GET request to a URL. Read more§fn post(
&self,
url: impl IntoUrl,
) -> RequestBuilder<'_, S, <S as HttpClientExt>::ExecuteResponse>
fn post( &self, url: impl IntoUrl, ) -> RequestBuilder<'_, S, <S as HttpClientExt>::ExecuteResponse>
POST request to a URL. Read more§fn put(
&self,
url: impl IntoUrl,
) -> RequestBuilder<'_, S, <S as HttpClientExt>::ExecuteResponse>
fn put( &self, url: impl IntoUrl, ) -> RequestBuilder<'_, S, <S as HttpClientExt>::ExecuteResponse>
PUT request to a URL. Read more§fn patch(
&self,
url: impl IntoUrl,
) -> RequestBuilder<'_, S, <S as HttpClientExt>::ExecuteResponse>
fn patch( &self, url: impl IntoUrl, ) -> RequestBuilder<'_, S, <S as HttpClientExt>::ExecuteResponse>
PATCH request to a URL. Read more§fn delete(
&self,
url: impl IntoUrl,
) -> RequestBuilder<'_, S, <S as HttpClientExt>::ExecuteResponse>
fn delete( &self, url: impl IntoUrl, ) -> RequestBuilder<'_, S, <S as HttpClientExt>::ExecuteResponse>
DELETE request to a URL. Read more§fn head(
&self,
url: impl IntoUrl,
) -> RequestBuilder<'_, S, <S as HttpClientExt>::ExecuteResponse>
fn head( &self, url: impl IntoUrl, ) -> RequestBuilder<'_, S, <S as HttpClientExt>::ExecuteResponse>
HEAD request to a URL. Read more§fn connect(
&self,
url: impl IntoUrl,
) -> RequestBuilder<'_, S, <S as HttpClientExt>::ExecuteResponse>
fn connect( &self, url: impl IntoUrl, ) -> RequestBuilder<'_, S, <S as HttpClientExt>::ExecuteResponse>
CONNECT request to a URL. Read more§fn request(
&self,
method: Method,
url: impl IntoUrl,
) -> RequestBuilder<'_, S, <S as HttpClientExt>::ExecuteResponse>
fn request( &self, method: Method, url: impl IntoUrl, ) -> RequestBuilder<'_, S, <S as HttpClientExt>::ExecuteResponse>
§fn build_from_request<RequestBody>(
&self,
request: Request<RequestBody>,
) -> RequestBuilder<'_, S, <S as HttpClientExt>::ExecuteResponse>
fn build_from_request<RequestBody>( &self, request: Request<RequestBody>, ) -> RequestBuilder<'_, S, <S as HttpClientExt>::ExecuteResponse>
§fn execute(
&self,
request: Request,
) -> impl Future<Output = Result<<S as HttpClientExt>::ExecuteResponse, <S as HttpClientExt>::ExecuteError>>
fn execute( &self, request: Request, ) -> impl Future<Output = Result<<S as HttpClientExt>::ExecuteResponse, <S as HttpClientExt>::ExecuteError>>
Request. Read more§impl<S, Body> HttpClientWebSocketExt<Body> for S
impl<S, Body> HttpClientWebSocketExt<Body> for S
§fn websocket(
&self,
url: impl IntoUrl,
) -> WebSocketRequestBuilder<WithService<'_, S, Body>>
fn websocket( &self, url: impl IntoUrl, ) -> WebSocketRequestBuilder<WithService<'_, S, Body>>
WebSocketRequestBuilder] to be used to establish a WebSocket connection over http/1.1.§fn websocket_h2(
&self,
url: impl IntoUrl,
) -> WebSocketRequestBuilder<WithService<'_, S, Body>>
fn websocket_h2( &self, url: impl IntoUrl, ) -> WebSocketRequestBuilder<WithService<'_, S, Body>>
WebSocketRequestBuilder to be used to establish a WebSocket connection over h2.§fn websocket_with_request<RequestBody>(
&self,
req: Request<RequestBody>,
) -> WebSocketRequestBuilder<WithService<'_, S, Body>>
fn websocket_with_request<RequestBody>( &self, req: Request<RequestBody>, ) -> WebSocketRequestBuilder<WithService<'_, S, Body>>
WebSocketRequestBuilder starting from the given request. Read more§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more§impl<S> IntoEndpointService<(S,)> for S
impl<S> IntoEndpointService<(S,)> for S
type Service = S
§fn into_endpoint_service(self) -> <S as IntoEndpointService<(S,)>>::Service
fn into_endpoint_service(self) -> <S as IntoEndpointService<(S,)>>::Service
rama_core::Service.§impl<S, State> IntoEndpointServiceWithState<(S,), State> for S
impl<S, State> IntoEndpointServiceWithState<(S,), State> for S
type Service = S
§fn into_endpoint_service_with_state(
self,
_state: State,
) -> <S as IntoEndpointServiceWithState<(S,), State>>::Service
fn into_endpoint_service_with_state( self, _state: State, ) -> <S as IntoEndpointServiceWithState<(S,), State>>::Service
rama_core::Service with state.§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
T in a rama_grpc::Request§impl<T> Pointable for T
impl<T> Pointable for T
§impl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> PolicyExt for Twhere
T: ?Sized,
§fn and<P, B, E>(self, other: P) -> And<T, P>
fn and<P, B, E>(self, other: P) -> And<T, P>
Policy that returns Action::Follow only if self and other return
Action::Follow. Read more