use std::future::Future;
use std::pin::Pin;
use std::sync::Arc;
use anyhow::Result;
use tokio::sync::RwLock;
pub type AuthFuture = Pin<Box<dyn Future<Output = Result<String>> + Send>>;
pub type AuthRefresher = Arc<dyn Fn() -> AuthFuture + Send + Sync>;
pub(super) struct AuthState {
pub(super) token: RwLock<Option<String>>,
pub(super) refresh: AuthRefresher,
pub(super) header: String,
pub(super) scheme: String,
}
impl AuthState {
pub(super) async fn current(&self) -> Result<String> {
if let Some(t) = self.token.read().await.clone() {
return Ok(t);
}
self.reacquire().await
}
pub(super) async fn reacquire(&self) -> Result<String> {
let t = (self.refresh)().await?;
*self.token.write().await = Some(t.clone());
Ok(t)
}
}