use thiserror::Error;
#[allow(missing_docs)]
#[derive(Debug, Error)]
pub enum ToolRegistrationError {
#[error("duplicate tool name '{name}'")]
DuplicateTool { name: String },
}
impl ToolRegistrationError {
pub fn duplicate_tool(name: impl Into<String>) -> Self {
Self::DuplicateTool { name: name.into() }
}
}
#[allow(missing_docs)]
#[derive(Debug, Error)]
pub enum ToolCallError {
#[error("unknown tool '{name}'. available tools: {available}")]
UnknownTool { name: String, available: String },
#[error("tool '{name}' execution failed: {source:#}")]
Execution {
name: String,
#[source]
source: anyhow::Error,
},
}
impl ToolCallError {
pub fn unknown_tool(
name: impl Into<String>,
available: impl IntoIterator<Item = impl AsRef<str>>,
) -> Self {
let available = available
.into_iter()
.map(|name| name.as_ref().to_owned())
.collect::<Vec<_>>();
let available = if available.is_empty() {
"(none)".to_owned()
} else {
available.join(", ")
};
Self::UnknownTool {
name: name.into(),
available,
}
}
pub fn execution(name: impl Into<String>, source: anyhow::Error) -> Self {
Self::Execution {
name: name.into(),
source,
}
}
}