use crate::slack::tools::{SlackAddReaction, SlackListThreads, SlackReadChannel, SlackSendMessage};
use adk_core::{ReadonlyContext, Result, Tool, Toolset};
use async_trait::async_trait;
use std::sync::Arc;
#[derive(Debug, Clone)]
pub enum TokenSource {
Direct(String),
SecretRef(String),
}
pub struct SlackToolset {
pub(crate) client: reqwest::Client,
pub(crate) token_source: TokenSource,
}
impl SlackToolset {
pub fn new(token: impl Into<String>) -> Self {
Self { client: reqwest::Client::new(), token_source: TokenSource::Direct(token.into()) }
}
pub fn from_secret(secret_name: impl Into<String>) -> Self {
Self {
client: reqwest::Client::new(),
token_source: TokenSource::SecretRef(secret_name.into()),
}
}
}
#[async_trait]
impl Toolset for SlackToolset {
fn name(&self) -> &str {
"slack"
}
async fn tools(&self, _ctx: Arc<dyn ReadonlyContext>) -> Result<Vec<Arc<dyn Tool>>> {
let client = self.client.clone();
let token_source = self.token_source.clone();
Ok(vec![
Arc::new(SlackSendMessage::new(client.clone(), token_source.clone())),
Arc::new(SlackReadChannel::new(client.clone(), token_source.clone())),
Arc::new(SlackAddReaction::new(client.clone(), token_source.clone())),
Arc::new(SlackListThreads::new(client, token_source)),
])
}
}