use crate::spanner::tools::{SpannerExecuteSql, SpannerGetTableSchema, SpannerListTables};
use adk_core::{ReadonlyContext, Result, Tool, Toolset};
use async_trait::async_trait;
use std::sync::Arc;
#[derive(Debug, Clone)]
pub enum CredentialSource {
ApplicationDefault,
SecretRef(String),
}
pub struct SpannerToolset {
pub(crate) project_id: String,
pub(crate) instance_id: String,
pub(crate) database_id: String,
pub(crate) credentials: CredentialSource,
}
impl SpannerToolset {
pub fn new(
project_id: impl Into<String>,
instance_id: impl Into<String>,
database_id: impl Into<String>,
) -> Self {
Self {
project_id: project_id.into(),
instance_id: instance_id.into(),
database_id: database_id.into(),
credentials: CredentialSource::ApplicationDefault,
}
}
pub fn from_secret(
project_id: impl Into<String>,
instance_id: impl Into<String>,
database_id: impl Into<String>,
secret_name: impl Into<String>,
) -> Self {
Self {
project_id: project_id.into(),
instance_id: instance_id.into(),
database_id: database_id.into(),
credentials: CredentialSource::SecretRef(secret_name.into()),
}
}
}
#[async_trait]
impl Toolset for SpannerToolset {
fn name(&self) -> &str {
"spanner"
}
async fn tools(&self, _ctx: Arc<dyn ReadonlyContext>) -> Result<Vec<Arc<dyn Tool>>> {
let project_id = self.project_id.clone();
let instance_id = self.instance_id.clone();
let database_id = self.database_id.clone();
let credentials = self.credentials.clone();
Ok(vec![
Arc::new(SpannerExecuteSql::new(
project_id.clone(),
instance_id.clone(),
database_id.clone(),
credentials.clone(),
)),
Arc::new(SpannerGetTableSchema::new(
project_id.clone(),
instance_id.clone(),
database_id.clone(),
credentials.clone(),
)),
Arc::new(SpannerListTables::new(project_id, instance_id, database_id, credentials)),
])
}
}