oauth2_client/
provider.rs

1use dyn_clone::{clone_trait_object, DynClone};
2
3use crate::re_exports::{ClientId, ClientSecret, Map, Scope, Url, Value};
4
5//
6//
7//
8pub trait Provider: DynClone {
9    type Scope: Scope;
10
11    fn client_id(&self) -> Option<&ClientId>;
12
13    fn client_secret(&self) -> Option<&ClientSecret>;
14
15    fn token_endpoint_url(&self) -> &Url;
16
17    // e.g. Mastodon's base_url
18    fn extra(&self) -> Option<Map<String, Value>> {
19        None
20    }
21}
22
23clone_trait_object!(<SCOPE> Provider<Scope = SCOPE> where SCOPE: Scope + Clone);
24
25//
26//
27//
28#[derive(Debug, Clone)]
29pub struct ProviderStringScopeWrapper<P>
30where
31    P: Provider,
32{
33    inner: P,
34}
35
36impl<P> ProviderStringScopeWrapper<P>
37where
38    P: Provider,
39{
40    pub fn new(provider: P) -> Self {
41        Self { inner: provider }
42    }
43}
44
45impl<P> Provider for ProviderStringScopeWrapper<P>
46where
47    P: Provider + Clone,
48{
49    type Scope = String;
50
51    fn client_id(&self) -> Option<&ClientId> {
52        self.inner.client_id()
53    }
54
55    fn client_secret(&self) -> Option<&ClientSecret> {
56        self.inner.client_secret()
57    }
58
59    fn token_endpoint_url(&self) -> &Url {
60        self.inner.token_endpoint_url()
61    }
62
63    fn extra(&self) -> Option<Map<String, Value>> {
64        self.inner.extra()
65    }
66
67    // Note
68}