1
0
Fork 0
mirror of https://gitlab.com/msrd0/gotham-restful.git synced 2025-04-20 14:57:01 +00:00

match content type

This commit is contained in:
Dominic 2019-10-20 15:53:30 +02:00
parent 197aad3c94
commit dd9e10a154
Signed by: msrd0
GPG key ID: DCC8C247452E98F9

View file

@ -20,7 +20,11 @@ use gotham::{
router::{
builder::*,
non_match::RouteNonMatch,
route::matcher::{AcceptHeaderRouteMatcher, RouteMatcher}
route::matcher::{
content_type::ContentTypeHeaderRouteMatcher,
AcceptHeaderRouteMatcher,
RouteMatcher
}
},
state::{FromState, State}
};
@ -305,6 +309,33 @@ impl From<Option<Vec<Mime>>> for MaybeMatchAcceptHeader
}
}
#[derive(Clone)]
struct MaybeMatchContentTypeHeader
{
matcher : Option<ContentTypeHeaderRouteMatcher>
}
impl RouteMatcher for MaybeMatchContentTypeHeader
{
fn is_match(&self, state : &State) -> Result<(), RouteNonMatch>
{
match &self.matcher {
Some(matcher) => matcher.is_match(state),
None => Ok(())
}
}
}
impl From<Option<Vec<Mime>>> for MaybeMatchContentTypeHeader
{
fn from(types : Option<Vec<Mime>>) -> Self
{
Self {
matcher: types.map(ContentTypeHeaderRouteMatcher::new)
}
}
}
macro_rules! implDrawResourceRoutes {
($implType:ident) => {
@ -386,9 +417,11 @@ macro_rules! implDrawResourceRoutes {
Res : ResourceResult,
Handler : ResourceCreate<Body, Res>
{
let matcher : MaybeMatchAcceptHeader = Res::accepted_types().into();
let accept_matcher : MaybeMatchAcceptHeader = Res::accepted_types().into();
let content_matcher : MaybeMatchContentTypeHeader = Body::supported_types().into();
self.0.post(&self.1)
.extend_route_matcher(matcher)
.extend_route_matcher(accept_matcher)
.extend_route_matcher(content_matcher)
.to(|state| create_handler::<Handler, Body, Res>(state));
}
@ -398,9 +431,11 @@ macro_rules! implDrawResourceRoutes {
Res : ResourceResult,
Handler : ResourceUpdateAll<Body, Res>
{
let matcher : MaybeMatchAcceptHeader = Res::accepted_types().into();
let accept_matcher : MaybeMatchAcceptHeader = Res::accepted_types().into();
let content_matcher : MaybeMatchContentTypeHeader = Body::supported_types().into();
self.0.put(&self.1)
.extend_route_matcher(matcher)
.extend_route_matcher(accept_matcher)
.extend_route_matcher(content_matcher)
.to(|state| update_all_handler::<Handler, Body, Res>(state));
}
@ -411,9 +446,11 @@ macro_rules! implDrawResourceRoutes {
Res : ResourceResult,
Handler : ResourceUpdate<ID, Body, Res>
{
let matcher : MaybeMatchAcceptHeader = Res::accepted_types().into();
let accept_matcher : MaybeMatchAcceptHeader = Res::accepted_types().into();
let content_matcher : MaybeMatchContentTypeHeader = Body::supported_types().into();
self.0.put(&format!("{}/:id", self.1))
.extend_route_matcher(matcher)
.extend_route_matcher(accept_matcher)
.extend_route_matcher(content_matcher)
.with_path_extractor::<PathExtractor<ID>>()
.to(|state| update_handler::<Handler, ID, Body, Res>(state));
}