vk_token_manager/
manager.rs

1//! This crate implements `ManageTokens` trait and default implementation for it: `TokenManager`.
2//! Also it provides `GroupId` new type.
3//! # Example
4//! ```no_run
5//! use token_manager::{TokenManager, ManageTokens};
6//! use token_manager::{GroupId, SimpleToken, Token};
7//! let mut manager = TokenManager::new(); // create token manager
8//! // put (boxed) token into.
9//! manager.add_token(GroupId::new(123), Box::new(SimpleToken::new(Token::new("my-token".into()))));
10//! let result = async {
11//!     // get token by id
12//!     let tok = manager.get_by_id(GroupId::new(123)).await;
13//!     assert_eq!(tok, Some(&Token::new("my-token".into())));
14//! };
15//!
16//! ```
17
18use crate::token::GetToken;
19use crate::token::Token;
20use async_trait::async_trait;
21use std::collections::HashMap;
22
23/// Newtype over 'i64' for `GroupId`.
24#[derive(Debug, Clone, Copy, Default, Eq, Hash, PartialEq)]
25pub struct GroupId(pub i64);
26
27/// Shortcut
28type BoxedSendSyncGetToken = Box<dyn GetToken + Send + Sync>;
29
30impl GroupId {
31    /// Create `GroupId` from `i64`.
32    /// # Using
33    /// ```
34    /// let group_id = GroupId::new(15);
35    /// ```
36    pub fn new(id: i64) -> Self {
37        Self(id)
38    }
39}
40
41/// Default implementor of `ManageTokens` trait.
42/// # Using
43/// ```
44/// let manager = TokenManager::new();
45/// ```
46#[derive(Default)]
47pub struct TokenManager {
48    pub tokens: HashMap<GroupId, BoxedSendSyncGetToken>,
49}
50
51impl TokenManager {
52    /// Create default token manager.
53    /// # Using
54    /// ```
55    /// let manager = TokenManager::new();
56    /// ```
57    pub fn new() -> Self {
58        Self::default()
59    }
60}
61
62/// Implementation of `ManageTokens` for default Token manager.
63#[async_trait]
64impl ManageTokens for TokenManager {
65    async fn get_by_id(&self, id: GroupId) -> Option<&Token> {
66        // TODO: possibility to get tokens on the fly
67        match self.tokens.get(&id) {
68            Some(tok) => Some(tok.get_token().await),
69            None => None,
70        }
71    }
72
73    fn add_token(&mut self, id: GroupId, token: BoxedSendSyncGetToken) {
74        self.tokens.insert(id, token);
75    }
76}
77
78/// Trait for managing tokens.
79#[async_trait]
80pub trait ManageTokens {
81    /// Get token by group id.
82    /// # Using
83    /// ```ignore
84    /// // manager here..
85    /// let result = manager.get_by_id(GroupId::new(5)).await;
86    /// ```
87    async fn get_by_id(&self, id: GroupId) -> Option<&Token>;
88
89    /// Add token.
90    /// # Using
91    /// ```ignore
92    /// // manager here..
93    /// manager.add_token(GroupId::new(5), Box::new(my_token));
94    /// ```
95    fn add_token(&mut self, id: GroupId, token: BoxedSendSyncGetToken);
96}