use monoloop_contracts::{ToolActionId, ToolUnavailableReason};
use std::future::Future;
use std::pin::Pin;
#[derive(Clone, Debug)]
pub struct ResolveToolRequest {
pub tool_action_id: ToolActionId,
pub tool_name: String,
pub request_payload: String,
}
#[derive(Clone, Debug)]
pub struct ToolDescriptorRef {
pub name: String,
}
#[derive(Clone, Debug)]
pub enum ToolResolution {
Available(ToolDescriptorRef),
Unavailable(ToolUnavailableReason),
}
#[derive(Clone, Debug, thiserror::Error)]
#[error("tool registry: {0}")]
pub struct ToolRegistryError(pub String);
type BoxFuture<'a, T> = Pin<Box<dyn Future<Output = T> + Send + 'a>>;
pub trait ToolRegistry: Send + Sync {
fn resolve<'a>(
&'a self,
request: ResolveToolRequest,
) -> BoxFuture<'a, Result<ToolResolution, ToolRegistryError>>;
}
#[derive(Clone, Debug, Default)]
pub struct EmptyToolRegistry;
impl EmptyToolRegistry {
pub fn new() -> Self {
Self
}
}
impl ToolRegistry for EmptyToolRegistry {
fn resolve<'a>(
&'a self,
_request: ResolveToolRequest,
) -> BoxFuture<'a, Result<ToolResolution, ToolRegistryError>> {
Box::pin(async {
Ok(ToolResolution::Unavailable(
ToolUnavailableReason::NoRegisteredTool,
))
})
}
}