monoloop_loop/
registry.rs1use monoloop_contracts::{ToolActionId, ToolUnavailableReason};
4use std::future::Future;
5use std::pin::Pin;
6
7#[derive(Clone, Debug)]
9pub struct ResolveToolRequest {
10 pub tool_action_id: ToolActionId,
12 pub tool_name: String,
14 pub request_payload: String,
16}
17
18#[derive(Clone, Debug)]
20pub struct ToolDescriptorRef {
21 pub name: String,
23}
24
25#[derive(Clone, Debug)]
27pub enum ToolResolution {
28 Available(ToolDescriptorRef),
30 Unavailable(ToolUnavailableReason),
32}
33
34#[derive(Clone, Debug, thiserror::Error)]
36#[error("tool registry: {0}")]
37pub struct ToolRegistryError(pub String);
38
39type BoxFuture<'a, T> = Pin<Box<dyn Future<Output = T> + Send + 'a>>;
40
41pub trait ToolRegistry: Send + Sync {
43 fn resolve<'a>(
45 &'a self,
46 request: ResolveToolRequest,
47 ) -> BoxFuture<'a, Result<ToolResolution, ToolRegistryError>>;
48}
49
50#[derive(Clone, Debug, Default)]
52pub struct EmptyToolRegistry;
53
54impl EmptyToolRegistry {
55 pub fn new() -> Self {
57 Self
58 }
59}
60
61impl ToolRegistry for EmptyToolRegistry {
62 fn resolve<'a>(
63 &'a self,
64 _request: ResolveToolRequest,
65 ) -> BoxFuture<'a, Result<ToolResolution, ToolRegistryError>> {
66 Box::pin(async {
67 Ok(ToolResolution::Unavailable(
68 ToolUnavailableReason::NoRegisteredTool,
69 ))
70 })
71 }
72}