oauth2_client/
provider.rs1use dyn_clone::{clone_trait_object, DynClone};
2
3use crate::re_exports::{ClientId, ClientSecret, Map, Scope, Url, Value};
4
5pub 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 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#[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 }