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}