diff --git a/Cargo.lock b/Cargo.lock index 9d614413..3535c081 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -952,7 +952,7 @@ dependencies = [ "serde", "serde_json", "tempfile", - "thiserror 2.0.17", + "thiserror 2.0.18", "tracing", ] @@ -977,6 +977,7 @@ dependencies = [ "codewhale-protocol", "serde", "serde_json", + "thiserror 2.0.18", "tokio", "uuid", ] @@ -1031,7 +1032,7 @@ dependencies = [ "starlark", "tar", "tempfile", - "thiserror 2.0.17", + "thiserror 2.0.18", "tiny_http", "tokio", "tokio-util", @@ -2723,7 +2724,7 @@ checksum = "bde5057d6143cc94e861d90f591b9303d6716c6b9602309150bd068853c10899" dependencies = [ "hashbrown 0.16.1", "portable-atomic", - "thiserror 2.0.17", + "thiserror 2.0.18", ] [[package]] @@ -3735,7 +3736,7 @@ dependencies = [ "rustc-hash", "rustls", "socket2", - "thiserror 2.0.17", + "thiserror 2.0.18", "tokio", "tracing", "web-time", @@ -3757,7 +3758,7 @@ dependencies = [ "rustls", "rustls-pki-types", "slab", - "thiserror 2.0.17", + "thiserror 2.0.18", "tinyvec", "tracing", "web-time", @@ -3895,7 +3896,7 @@ dependencies = [ "kasuari", "lru", "strum", - "thiserror 2.0.17", + "thiserror 2.0.18", "unicode-segmentation", "unicode-truncate", "unicode-width 0.2.0", @@ -3989,7 +3990,7 @@ checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" dependencies = [ "getrandom 0.2.16", "libredox", - "thiserror 2.0.17", + "thiserror 2.0.18", ] [[package]] @@ -5049,11 +5050,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.17" +version = "2.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" +checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" dependencies = [ - "thiserror-impl 2.0.17", + "thiserror-impl 2.0.18", ] [[package]] @@ -5069,9 +5070,9 @@ dependencies = [ [[package]] name = "thiserror-impl" -version = "2.0.17" +version = "2.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" +checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" dependencies = [ "proc-macro2", "quote", @@ -5376,7 +5377,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "786d480bce6247ab75f005b14ae1624ad978d3029d9113f0a22fa1ac773faeaf" dependencies = [ "crossbeam-channel", - "thiserror 2.0.17", + "thiserror 2.0.18", "time", "tracing-subscriber", ] diff --git a/crates/tools/Cargo.toml b/crates/tools/Cargo.toml index 2be5cc0d..e3f5a491 100644 --- a/crates/tools/Cargo.toml +++ b/crates/tools/Cargo.toml @@ -12,5 +12,6 @@ async-trait.workspace = true codewhale-protocol = { path = "../protocol", version = "0.8.46" } serde.workspace = true serde_json.workspace = true +thiserror.workspace = true tokio.workspace = true uuid.workspace = true diff --git a/crates/tools/src/lib.rs b/crates/tools/src/lib.rs index e11abf68..b8be5824 100644 --- a/crates/tools/src/lib.rs +++ b/crates/tools/src/lib.rs @@ -44,57 +44,24 @@ pub enum ApprovalRequirement { } /// Errors that can occur during tool execution. -#[derive(Debug, Clone)] +#[derive(Debug, Clone, thiserror::Error)] pub enum ToolError { + #[error("Failed to validate input: {message}")] InvalidInput { message: String }, + #[error("Failed to validate input: missing required field '{field}'")] MissingField { field: String }, + #[error("Failed to resolve path '{}': path escapes workspace", path.display())] PathEscape { path: PathBuf }, + #[error("Failed to execute tool: {message}")] ExecutionFailed { message: String }, + #[error("Failed to execute tool: operation timed out after {seconds}s")] Timeout { seconds: u64 }, + #[error("Failed to locate tool: {message}")] NotAvailable { message: String }, + #[error("Failed to authorize tool execution: {message}")] PermissionDenied { message: String }, } -impl std::fmt::Display for ToolError { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - match self { - Self::InvalidInput { message } => { - write!(f, "Failed to validate input: {message}") - } - Self::MissingField { field } => { - write!( - f, - "Failed to validate input: missing required field '{field}'" - ) - } - Self::PathEscape { path } => { - write!( - f, - "Failed to resolve path '{}': path escapes workspace", - path.display() - ) - } - Self::ExecutionFailed { message } => { - write!(f, "Failed to execute tool: {message}") - } - Self::Timeout { seconds } => { - write!( - f, - "Failed to execute tool: operation timed out after {seconds}s" - ) - } - Self::NotAvailable { message } => { - write!(f, "Failed to locate tool: {message}") - } - Self::PermissionDenied { message } => { - write!(f, "Failed to authorize tool execution: {message}") - } - } - } -} - -impl std::error::Error for ToolError {} - impl ToolError { #[must_use] pub fn invalid_input(msg: impl Into) -> Self {