use std::collections::HashMap;
use std::sync::RwLock;
use super::{TokenRecord, TokenStore};
use crate::error::TokenStoreError;
#[derive(Default)]
pub struct InMemoryTokenStore {
records: RwLock<HashMap<String, TokenRecord>>,
}
impl TokenStore for InMemoryTokenStore {
fn save(&self, record: TokenRecord) -> Result<(), TokenStoreError> {
let mut guard = self
.records
.write()
.map_err(|_| TokenStoreError::Storage("in-memory token store lock poisoned".into()))?;
guard.insert(record.access_token.clone(), record);
Ok(())
}
fn revoke(&self, access_token: &str) -> Result<(), TokenStoreError> {
let mut guard = self
.records
.write()
.map_err(|_| TokenStoreError::Storage("in-memory token store lock poisoned".into()))?;
guard
.remove(access_token)
.map(|_| ())
.ok_or_else(|| TokenStoreError::NotFound(access_token.into()))
}
fn find(&self, access_token: &str) -> Result<Option<TokenRecord>, TokenStoreError> {
let guard = self
.records
.read()
.map_err(|_| TokenStoreError::Storage("in-memory token store lock poisoned".into()))?;
Ok(guard.get(access_token).cloned())
}
}