Teal.fm scrobbler for Plex
1use std::{ops::Deref, sync::Arc};
2
3use atproto_identity::{key::KeyProvider, resolve::IdentityResolver, storage::DidDocumentStorage};
4use atproto_oauth::storage::OAuthRequestStorage;
5use atproto_oauth_axum::state::OAuthClientConfig;
6use axum::extract::FromRef;
7
8pub struct InnerWebContext {
9 pub http_client: reqwest::Client,
10 pub identity_resolver: Arc<dyn IdentityResolver>,
11 pub oauth_client_config: OAuthClientConfig,
12 pub oauth_storage: Arc<dyn OAuthRequestStorage + Send + Sync>,
13 pub document_storage: Arc<dyn DidDocumentStorage + Send + Sync>,
14 pub key_provider: Arc<dyn KeyProvider + Send + Sync>,
15}
16
17#[derive(Clone, FromRef)]
18pub struct WebContext(pub Arc<InnerWebContext>);
19
20impl Deref for WebContext {
21 type Target = InnerWebContext;
22
23 fn deref(&self) -> &Self::Target {
24 &self.0
25 }
26}
27
28impl FromRef<WebContext> for OAuthClientConfig {
29 fn from_ref(context: &WebContext) -> Self {
30 context.0.oauth_client_config.clone()
31 }
32}
33
34impl FromRef<WebContext> for reqwest::Client {
35 fn from_ref(context: &WebContext) -> Self {
36 context.0.http_client.clone()
37 }
38}
39
40impl FromRef<WebContext> for Arc<dyn OAuthRequestStorage> {
41 fn from_ref(context: &WebContext) -> Self {
42 context.0.oauth_storage.clone()
43 }
44}
45
46impl FromRef<WebContext> for Arc<dyn DidDocumentStorage> {
47 fn from_ref(context: &WebContext) -> Self {
48 context.0.document_storage.clone()
49 }
50}
51
52impl FromRef<WebContext> for Arc<dyn KeyProvider> {
53 fn from_ref(context: &WebContext) -> Self {
54 context.0.key_provider.clone()
55 }
56}
57
58impl FromRef<WebContext> for Arc<dyn IdentityResolver> {
59 fn from_ref(context: &WebContext) -> Self {
60 context.0.identity_resolver.clone()
61 }
62}