oauth 0.0.2

Universal OAuth 2.0 adapter for Rust web frameworks
Documentation
use std::collections::HashMap;
use std::sync::RwLock;

use super::{TokenRecord, TokenStore};
use crate::error::TokenStoreError;

/// In-memory token store backed by a `HashMap`.
#[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())
    }
}