1
use std::sync::Arc;
2

            
3
use oxide_auth::primitives::scope::Scope;
4
use oxide_auth_async::{
5
    code_grant::{
6
        access_token::{Endpoint as AccessTokenEndpoint, Extension as AccessTokenExtension},
7
        authorization::{Endpoint as AuthorizationEndpoint, Extension as AuthorizationExtension},
8
        refresh::Endpoint as RefreshEndpoint,
9
        resource::Endpoint as ResourceEndpoint,
10
    },
11
    primitives::{Authorizer, Issuer, Registrar},
12
};
13

            
14
use super::primitive::Primitive;
15
use crate::models::Model;
16

            
17
#[derive(Clone)]
18
pub struct Endpoint {
19
    primitive: Primitive,
20
    extension_fallback: (),
21
    scopes: Vec<Scope>,
22
}
23

            
24
impl Endpoint {
25
55836
    pub fn new(model: Arc<dyn Model>, resource_scopes: Option<&str>) -> Self {
26
55836
        Endpoint {
27
55836
            primitive: Primitive::new(model.clone()),
28
55836
            extension_fallback: (),
29
55836
            scopes: match resource_scopes {
30
1268
                None => vec![],
31
54568
                Some(scopes) => vec![scopes.parse().unwrap()],
32
            },
33
        }
34
55836
    }
35
}
36

            
37
impl AccessTokenEndpoint for Endpoint {
38
524
    fn registrar(&self) -> &(dyn Registrar + Sync) {
39
524
        &self.primitive
40
524
    }
41

            
42
508
    fn authorizer(&mut self) -> &mut (dyn Authorizer + Send) {
43
508
        &mut self.primitive
44
508
    }
45

            
46
500
    fn issuer(&mut self) -> &mut (dyn Issuer + Send) {
47
500
        &mut self.primitive
48
500
    }
49

            
50
496
    fn extension(&mut self) -> &mut (dyn AccessTokenExtension + Send) {
51
496
        &mut self.extension_fallback
52
496
    }
53
}
54

            
55
impl AuthorizationEndpoint for Endpoint {
56
1208
    fn registrar(&self) -> &(dyn Registrar + Sync) {
57
1208
        &self.primitive
58
1208
    }
59

            
60
548
    fn authorizer(&mut self) -> &mut (dyn Authorizer + Send) {
61
548
        &mut self.primitive
62
548
    }
63

            
64
596
    fn extension(&mut self) -> &mut (dyn AuthorizationExtension + Send) {
65
596
        &mut self.extension_fallback
66
596
    }
67
}
68

            
69
impl RefreshEndpoint for Endpoint {
70
52
    fn registrar(&self) -> &(dyn Registrar + Sync) {
71
52
        &self.primitive
72
52
    }
73

            
74
84
    fn issuer(&mut self) -> &mut (dyn Issuer + Send) {
75
84
        &mut self.primitive
76
84
    }
77
}
78

            
79
impl ResourceEndpoint for Endpoint {
80
996
    fn scopes(&mut self) -> &[Scope] {
81
996
        self.scopes.as_slice()
82
996
    }
83

            
84
996
    fn issuer(&mut self) -> &mut (dyn Issuer + Send) {
85
996
        &mut self.primitive
86
996
    }
87
}