use std::sync::Arc;
use sa_token_adapter::storage::SaStorage;
use sa_token_core::{SaTokenManager, SaTokenConfig, StpUtil, SaTokenListener};
#[derive(Clone)]
pub struct SaTokenState {
pub manager: Arc<SaTokenManager>,
}
impl SaTokenState {
pub fn new(storage: Arc<dyn SaStorage>, config: SaTokenConfig) -> Self {
Self {
manager: Arc::new(SaTokenManager::new(storage, config)),
}
}
pub fn from_manager(manager: SaTokenManager) -> Self {
StpUtil::init_manager(manager.clone());
Self {
manager: Arc::new(manager),
}
}
pub fn builder() -> SaTokenStateBuilder {
SaTokenStateBuilder::default()
}
}
#[derive(Default)]
pub struct SaTokenStateBuilder {
config_builder: sa_token_core::config::SaTokenConfigBuilder,
listeners: Vec<Arc<dyn SaTokenListener>>,
}
impl SaTokenStateBuilder {
pub fn new() -> Self {
Self::default()
}
pub fn token_name(mut self, name: impl Into<String>) -> Self {
self.config_builder = self.config_builder.token_name(name);
self
}
pub fn timeout(mut self, timeout: i64) -> Self {
self.config_builder = self.config_builder.timeout(timeout);
self
}
pub fn active_timeout(mut self, timeout: i64) -> Self {
self.config_builder = self.config_builder.active_timeout(timeout);
self
}
pub fn auto_renew(mut self, enabled: bool) -> Self {
self.config_builder = self.config_builder.auto_renew(enabled);
self
}
pub fn is_concurrent(mut self, concurrent: bool) -> Self {
self.config_builder = self.config_builder.is_concurrent(concurrent);
self
}
pub fn is_share(mut self, share: bool) -> Self {
self.config_builder = self.config_builder.is_share(share);
self
}
pub fn token_style(mut self, style: sa_token_core::config::TokenStyle) -> Self {
self.config_builder = self.config_builder.token_style(style);
self
}
pub fn token_prefix(mut self, prefix: impl Into<String>) -> Self {
self.config_builder = self.config_builder.token_prefix(prefix);
self
}
pub fn jwt_secret_key(mut self, key: impl Into<String>) -> Self {
self.config_builder = self.config_builder.jwt_secret_key(key);
self
}
pub fn storage(mut self, storage: Arc<dyn SaStorage>) -> Self {
self.config_builder = self.config_builder.storage(storage);
self
}
pub fn listener(mut self, listener: Arc<dyn SaTokenListener>) -> Self {
self.listeners.push(listener);
self
}
pub fn listeners(mut self, listeners: Vec<Arc<dyn SaTokenListener>>) -> Self {
self.listeners.extend(listeners);
self
}
pub fn build(self) -> SaTokenState {
let manager = self.config_builder.build();
for listener in self.listeners {
manager.event_bus().register(listener);
}
SaTokenState {
manager: Arc::new(manager),
}
}
}