oxide_auth_async/frontends/simple/extensions/
list.rs1use async_trait::async_trait;
2use oxide_auth::code_grant::authorization::Request;
3use oxide_auth::code_grant::accesstoken::Request as TokenRequest;
4use oxide_auth::code_grant::client_credentials::Request as ClientCredentialsRequest;
5use oxide_auth::frontends::simple::extensions::{AddonList, AddonResult};
6use oxide_auth::primitives::grant::Extensions;
7
8use crate::endpoint::Extension;
9use crate::code_grant::access_token::{Extension as AccessTokenExtension};
10use crate::code_grant::authorization::Extension as AuthorizationExtension;
11use crate::code_grant::client_credentials::{Extension as ClientCredentialsExtension};
12
13impl Extension for AddonList {
14 fn authorization(&mut self) -> Option<&mut (dyn AuthorizationExtension + Send)> {
15 Some(self)
16 }
17
18 fn access_token(&mut self) -> Option<&mut (dyn AccessTokenExtension + Send)> {
19 Some(self)
20 }
21
22 fn client_credentials(&mut self) -> Option<&mut (dyn ClientCredentialsExtension + Send)> {
23 Some(self)
24 }
25}
26
27#[async_trait]
28impl AuthorizationExtension for AddonList {
29 async fn extend(&mut self, request: &(dyn Request + Sync)) -> std::result::Result<Extensions, ()> {
30 let mut result_data = Extensions::new();
31
32 for ext in self.authorization.iter() {
33 let result = ext.execute(request);
34
35 match result {
36 AddonResult::Ok => (),
37 AddonResult::Data(data) => result_data.set(ext, data),
38 AddonResult::Err => return Err(()),
39 }
40 }
41
42 Ok(result_data)
43 }
44}
45
46#[async_trait]
47impl AccessTokenExtension for AddonList {
48 async fn extend(
49 &mut self, request: &(dyn TokenRequest + Sync), mut data: Extensions,
50 ) -> std::result::Result<Extensions, ()> {
51 let mut result_data = Extensions::new();
52
53 for ext in self.access_token.iter() {
54 let ext_data = data.remove(ext);
55 let result = ext.execute(request, ext_data);
56
57 match result {
58 AddonResult::Ok => (),
59 AddonResult::Data(data) => result_data.set(ext, data),
60 AddonResult::Err => return Err(()),
61 }
62 }
63
64 Ok(result_data)
65 }
66}
67
68#[async_trait]
69impl ClientCredentialsExtension for AddonList {
70 async fn extend(
71 &mut self, request: &(dyn ClientCredentialsRequest + Sync),
72 ) -> std::result::Result<Extensions, ()> {
73 let mut result_data = Extensions::new();
74
75 for ext in self.client_credentials.iter() {
76 let result = ext.execute(request);
77
78 match result {
79 AddonResult::Ok => (),
80 AddonResult::Data(data) => result_data.set(ext, data),
81 AddonResult::Err => return Err(()),
82 }
83 }
84
85 Ok(result_data)
86 }
87}