actix_web_grants/permissions/
extractors.rs1use actix_web::dev::ServiceRequest;
2use actix_web::Error;
3use std::future::Future;
4
5pub trait PermissionsExtractor<'a, Req, Type> {
6 type Future: Future<Output = Result<Vec<Type>, Error>>;
7
8 fn extract(&self, request: &'a mut ServiceRequest) -> Self::Future;
9}
10
11impl<'a, F, O, Type> PermissionsExtractor<'a, &ServiceRequest, Type> for F
12where
13 F: Fn(&'a ServiceRequest) -> O,
14 O: Future<Output = Result<Vec<Type>, Error>>,
15 Type: PartialEq + Clone + 'static,
16{
17 type Future = O;
18
19 fn extract(&self, req: &'a mut ServiceRequest) -> Self::Future {
20 (self)(req)
21 }
22}
23
24impl<'a, F, O, Type> PermissionsExtractor<'a, &mut ServiceRequest, Type> for F
25where
26 F: Fn(&'a mut ServiceRequest) -> O,
27 O: Future<Output = Result<Vec<Type>, Error>>,
28 Type: PartialEq + Clone + 'static,
29{
30 type Future = O;
31
32 fn extract(&self, req: &'a mut ServiceRequest) -> Self::Future {
33 (self)(req)
34 }
35}
36
37#[cfg(test)]
38mod tests {
39 use super::*;
40 use actix_web::dev::ServiceRequest;
41 use actix_web::test;
42
43 async fn extract(_req: &ServiceRequest) -> Result<Vec<String>, Error> {
44 Ok(vec!["TEST_PERMISSION".to_string()])
45 }
46
47 #[actix_rt::test]
48 async fn test_fn_extractor_impl() {
49 let mut req = test::TestRequest::get().to_srv_request();
50 let permissions = extract.extract(&mut req).await;
51
52 permissions
53 .unwrap()
54 .iter()
55 .for_each(|perm| assert_eq!("TEST_PERMISSION", perm.as_str()));
56 }
57
58 async fn mut_extract(_req: &mut ServiceRequest) -> Result<Vec<String>, Error> {
59 Ok(vec!["TEST_PERMISSION".to_string()])
60 }
61
62 #[actix_rt::test]
63 async fn test_fn_mut_extractor_impl() {
64 let mut req = test::TestRequest::get().to_srv_request();
65 let permissions = mut_extract.extract(&mut req).await;
66
67 permissions
68 .unwrap()
69 .iter()
70 .for_each(|perm| assert_eq!("TEST_PERMISSION", perm.as_str()));
71 }
72}