rocket_simple_authorization/
macros.rs1#[macro_export]
3macro_rules! authorizer {
4 ($name:ty) => {
5 #[$crate::rocket::async_trait]
6 impl<'r> $crate::rocket::request::FromRequest<'r> for $name {
7 type Error = ();
8
9 async fn from_request(
10 request: &'r $crate::rocket::request::Request<'_>,
11 ) -> $crate::rocket::request::Outcome<Self, Self::Error> {
12 let key: Option<&str> = request.headers().get("authorization").next();
13
14 match <$name as $crate::SimpleAuthorization>::authorizing(request, key).await {
15 Some(ins) => $crate::rocket::outcome::Outcome::Success(ins),
16 None => $crate::rocket::outcome::Outcome::Forward(
17 $crate::rocket::http::Status::Unauthorized,
18 ),
19 }
20 }
21 }
22 };
23 (ref $name:ty) => {
24 $crate::authorizer!($name);
25
26 #[$crate::rocket::async_trait]
27 impl<'r> $crate::rocket::request::FromRequest<'r> for &'r $name {
28 type Error = ();
29
30 async fn from_request(
31 request: &'r $crate::rocket::request::Request<'_>,
32 ) -> $crate::rocket::request::Outcome<Self, Self::Error> {
33 async fn f(request: &$crate::rocket::request::Request<'_>) -> Option<$name> {
34 let key: Option<&str> = request.headers().get("authorization").next();
35
36 match <$name as $crate::SimpleAuthorization>::authorizing(request, key).await {
37 Some(ins) => Some(ins),
38 None => None,
39 }
40 }
41
42 let cache = request.local_cache_async(f(request)).await;
43
44 match cache.as_ref() {
45 Some(cache) => $crate::rocket::outcome::Outcome::Success(cache),
46 None => $crate::rocket::outcome::Outcome::Forward(
47 $crate::rocket::http::Status::Unauthorized,
48 ),
49 }
50 }
51 }
52 };
53}