Skip to main content

agentlink_sdk/
token_manager.rs

1//! Token Manager
2//!
3//! Manages JWT token for authenticated API calls.
4//! The token is stored internally and automatically used by services.
5
6use std::sync::{Arc, RwLock};
7
8/// Token manager for handling JWT authentication
9#[derive(Debug, Clone)]
10pub struct TokenManager {
11    token: Arc<RwLock<Option<String>>>,
12}
13
14impl TokenManager {
15    /// Create a new token manager
16    pub fn new() -> Self {
17        Self {
18            token: Arc::new(RwLock::new(None)),
19        }
20    }
21
22    /// Set the token
23    pub fn set_token(&self, token: &str) {
24        if let Ok(mut guard) = self.token.write() {
25            *guard = Some(token.to_string());
26        }
27    }
28
29    /// Get the token
30    pub fn get_token(&self) -> Option<String> {
31        self.token.read().ok().and_then(|guard| guard.clone())
32    }
33
34    /// Clear the token (logout)
35    pub fn clear_token(&self) {
36        if let Ok(mut guard) = self.token.write() {
37            *guard = None;
38        }
39    }
40
41    /// Check if token is set
42    pub fn has_token(&self) -> bool {
43        self.get_token().is_some()
44    }
45}
46
47impl Default for TokenManager {
48    fn default() -> Self {
49        Self::new()
50    }
51}
52
53#[cfg(test)]
54mod tests {
55    use super::*;
56
57    #[test]
58    fn test_token_manager() {
59        let manager = TokenManager::new();
60        
61        // Initially no token
62        assert!(!manager.has_token());
63        assert_eq!(manager.get_token(), None);
64        
65        // Set token
66        manager.set_token("test_token_123");
67        assert!(manager.has_token());
68        assert_eq!(manager.get_token(), Some("test_token_123".to_string()));
69        
70        // Clear token
71        manager.clear_token();
72        assert!(!manager.has_token());
73        assert_eq!(manager.get_token(), None);
74    }
75}