1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
use std::fmt;
use std::sync::Arc;
use super::{AuthorizationAddon, AccessTokenAddon, AddonResult};
use crate::code_grant::accesstoken::{Extension as AccessTokenExtension, Request};
use crate::code_grant::authorization::{Extension as AuthorizationExtension, Request as AuthRequest};
use crate::endpoint::Extension;
use crate::primitives::grant::{Extensions, GrantExtension};
pub struct AddonList {
authorization: Vec<Arc<dyn AuthorizationAddon + Send + Sync + 'static>>,
access_token: Vec<Arc<dyn AccessTokenAddon + Send + Sync + 'static>>,
}
impl AddonList {
pub fn new() -> Self {
AddonList {
authorization: vec![],
access_token: vec![],
}
}
pub fn push_authorization<A>(&mut self, addon: A)
where
A: AuthorizationAddon + Send + Sync + 'static,
{
self.authorization.push(Arc::new(addon))
}
pub fn push_access_token<A>(&mut self, addon: A)
where
A: AccessTokenAddon + Send + Sync + 'static,
{
self.access_token.push(Arc::new(addon))
}
pub fn push_code<A>(&mut self, addon: A)
where
A: AuthorizationAddon + AccessTokenAddon + Send + Sync + 'static,
{
let arc = Arc::new(addon);
self.authorization.push(arc.clone());
self.access_token.push(arc)
}
}
impl Default for AddonList {
fn default() -> Self {
AddonList::new()
}
}
impl Extension for AddonList {
fn authorization(&mut self) -> Option<&mut dyn AuthorizationExtension> {
Some(self)
}
fn access_token(&mut self) -> Option<&mut dyn AccessTokenExtension> {
Some(self)
}
}
impl AccessTokenExtension for AddonList {
fn extend(
&mut self, request: &dyn Request, mut data: Extensions,
) -> std::result::Result<Extensions, ()> {
let mut result_data = Extensions::new();
for ext in self.access_token.iter() {
let ext_data = data.remove(ext);
let result = ext.execute(request, ext_data);
match result {
AddonResult::Ok => (),
AddonResult::Data(data) => result_data.set(ext, data),
AddonResult::Err => return Err(()),
}
}
Ok(result_data)
}
}
impl AuthorizationExtension for AddonList {
fn extend(&mut self, request: &dyn AuthRequest) -> Result<Extensions, ()> {
let mut result_data = Extensions::new();
for ext in self.authorization.iter() {
let result = ext.execute(request);
match result {
AddonResult::Ok => (),
AddonResult::Data(data) => result_data.set(ext, data),
AddonResult::Err => return Err(()),
}
}
Ok(result_data)
}
}
impl fmt::Debug for AddonList {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
use std::slice::Iter;
struct ExtIter<'a, T: GrantExtension + 'a>(Iter<'a, T>);
impl<'a, T: GrantExtension> fmt::Debug for ExtIter<'a, T> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
f.debug_list().entries(self.0.clone().map(T::identifier)).finish()
}
}
f.debug_struct("AddonList")
.field("authorization", &ExtIter(self.authorization.iter()))
.field("access_token", &ExtIter(self.access_token.iter()))
.finish()
}
}