use std::{ops::Deref, sync::Arc}; use axum::extract::FromRequestParts; use serde::{Deserialize, Serialize}; #[derive(Debug, Clone)] pub struct UserState(Arc); impl Deref for UserState { type Target = UserStateInner; fn deref(&self) -> &Self::Target { &self.0 } } impl From for UserState { fn from(value: UserStateInner) -> Self { Self(Arc::new(value)) } } #[derive(Debug, Clone, Serialize, Deserialize, Default)] pub struct UserStateInner { /// Subject in Oauth pub sub: String, /// Access Token pub access_token: String, /// Refresh Token pub refresh_token: String, /// User pub user: User, } #[derive(Debug, Clone, Serialize, Deserialize, Default)] pub struct User { /// Email pub email: String, /// Avatar Url pub avatar_url: String, } impl FromRequestParts for UserState where S: std::marker::Sync + std::marker::Send, { type Rejection = super::Error; async fn from_request_parts( parts: &mut axum::http::request::Parts, _: &S, ) -> Result { parts .extensions .get::() .cloned() .ok_or(super::Error::StateError("Unable to get extension".into())) } }