From cfcd376fc33fedc2e8367cce7e056698cbd37a71 Mon Sep 17 00:00:00 2001 From: Sewer56 Date: Sun, 18 Jan 2026 12:18:00 +0000 Subject: [PATCH] Changed: Move Edit-specific error conversion to common module Extract tool-specific error handling from convert.rs into a new common/edit.rs module. This separates concerns: - convert.rs now contains only general-purpose conversions - common/edit.rs contains Edit tool-specific error_to_serdes - Both absolute/edit.rs and allowed/edit.rs import from common::edit This establishes a pattern for future tool-specific helpers. --- .../src/absolute/edit.rs | 4 +- .../src/allowed/edit.rs | 4 +- .../src/common/edit.rs | 40 +++++++++++++++++++ .../src/common/mod.rs | 3 ++ src/llm-coding-tools-serdesai/src/convert.rs | 37 ----------------- src/llm-coding-tools-serdesai/src/lib.rs | 1 + 6 files changed, 48 insertions(+), 41 deletions(-) create mode 100644 src/llm-coding-tools-serdesai/src/common/edit.rs create mode 100644 src/llm-coding-tools-serdesai/src/common/mod.rs diff --git a/src/llm-coding-tools-serdesai/src/absolute/edit.rs b/src/llm-coding-tools-serdesai/src/absolute/edit.rs index 540fcd97..1f278919 100644 --- a/src/llm-coding-tools-serdesai/src/absolute/edit.rs +++ b/src/llm-coding-tools-serdesai/src/absolute/edit.rs @@ -10,7 +10,7 @@ use serdes_ai::tools::{ RunContext, SchemaBuilder, Tool, ToolDefinition, ToolError, ToolResult, ToolReturn, }; -use crate::convert::edit_error_to_serdes; +use crate::common::edit::error_to_serdes; /// Internal args for JSON deserialization. #[derive(Debug, Deserialize)] @@ -74,7 +74,7 @@ impl Tool for EditTool { ) .await; - result.map(ToolReturn::text).map_err(edit_error_to_serdes) + result.map(ToolReturn::text).map_err(error_to_serdes) } } diff --git a/src/llm-coding-tools-serdesai/src/allowed/edit.rs b/src/llm-coding-tools-serdesai/src/allowed/edit.rs index b79c108e..232e4574 100644 --- a/src/llm-coding-tools-serdesai/src/allowed/edit.rs +++ b/src/llm-coding-tools-serdesai/src/allowed/edit.rs @@ -11,7 +11,7 @@ use serdes_ai::tools::{ }; use std::path::Path; -use crate::convert::edit_error_to_serdes; +use crate::common::edit::error_to_serdes; /// Internal args for JSON deserialization. #[derive(Debug, Deserialize)] @@ -86,7 +86,7 @@ impl Tool for EditTool { ) .await; - result.map(ToolReturn::text).map_err(edit_error_to_serdes) + result.map(ToolReturn::text).map_err(error_to_serdes) } } diff --git a/src/llm-coding-tools-serdesai/src/common/edit.rs b/src/llm-coding-tools-serdesai/src/common/edit.rs new file mode 100644 index 00000000..08068a70 --- /dev/null +++ b/src/llm-coding-tools-serdesai/src/common/edit.rs @@ -0,0 +1,40 @@ +//! Shared helpers for Edit tool implementations. + +use llm_coding_tools_core::operations::EditError; +use llm_coding_tools_core::tool_names; +use serdes_ai::tools::ToolError; + +use crate::convert::core_error_to_serdes; + +/// Convert [`EditError`] to serdesAI error. +/// +/// Maps edit-specific errors to appropriate error types: +/// - Validation errors: `NotFound`, `AmbiguousMatch`, `EmptyOldString`, `IdenticalStrings` +/// - Execution errors: `Tool(ToolError)` (IO, path errors) +pub(crate) fn error_to_serdes(err: EditError) -> ToolError { + match err { + EditError::NotFound => ToolError::validation_error( + tool_names::EDIT, + Some("old_string".to_string()), + "old_string not found in file content".to_string(), + ), + EditError::AmbiguousMatch(count) => ToolError::validation_error( + tool_names::EDIT, + Some("old_string".to_string()), + format!( + "old_string found {count} times and requires more code context to uniquely identify the intended match" + ), + ), + EditError::EmptyOldString => ToolError::validation_error( + tool_names::EDIT, + Some("old_string".to_string()), + "old_string must not be empty".to_string(), + ), + EditError::IdenticalStrings => ToolError::validation_error( + tool_names::EDIT, + None, + "old_string and new_string must be different".to_string(), + ), + EditError::Tool(tool_err) => core_error_to_serdes(tool_names::EDIT, tool_err), + } +} diff --git a/src/llm-coding-tools-serdesai/src/common/mod.rs b/src/llm-coding-tools-serdesai/src/common/mod.rs new file mode 100644 index 00000000..88713424 --- /dev/null +++ b/src/llm-coding-tools-serdesai/src/common/mod.rs @@ -0,0 +1,3 @@ +//! Shared helpers for tool implementations. + +pub(crate) mod edit; diff --git a/src/llm-coding-tools-serdesai/src/convert.rs b/src/llm-coding-tools-serdesai/src/convert.rs index 4ac25563..e677f27d 100644 --- a/src/llm-coding-tools-serdesai/src/convert.rs +++ b/src/llm-coding-tools-serdesai/src/convert.rs @@ -5,8 +5,6 @@ //! //! [`llm_coding_tools_core`]: llm_coding_tools_core -use llm_coding_tools_core::operations::EditError; -use llm_coding_tools_core::tool_names; use llm_coding_tools_core::{ToolError as CoreError, ToolOutput, ToolResult as CoreResult}; use serde_json::json; use serdes_ai::tools::{ToolError as SerdesError, ToolReturn}; @@ -59,41 +57,6 @@ pub fn to_serdes_result( .map_err(|err| core_error_to_serdes(tool_name, err)) } -/// Convert [`EditError`] to serdesAI error. -/// -/// Maps edit-specific errors to appropriate error types: -/// - Validation errors: `NotFound`, `AmbiguousMatch`, `EmptyOldString`, `IdenticalStrings` -/// - Execution errors: `Tool(ToolError)` (IO, path errors) -/// -/// [`EditError`]: llm_coding_tools_core::operations::EditError -pub fn edit_error_to_serdes(err: EditError) -> SerdesError { - match err { - EditError::NotFound => SerdesError::validation_error( - tool_names::EDIT, - Some("old_string".to_string()), - "old_string not found in file content".to_string(), - ), - EditError::AmbiguousMatch(count) => SerdesError::validation_error( - tool_names::EDIT, - Some("old_string".to_string()), - format!( - "old_string found {count} times and requires more code context to uniquely identify the intended match" - ), - ), - EditError::EmptyOldString => SerdesError::validation_error( - tool_names::EDIT, - Some("old_string".to_string()), - "old_string must not be empty".to_string(), - ), - EditError::IdenticalStrings => SerdesError::validation_error( - tool_names::EDIT, - None, - "old_string and new_string must be different".to_string(), - ), - EditError::Tool(tool_err) => core_error_to_serdes(tool_names::EDIT, tool_err), - } -} - /// Convert core [`ToolError`][core] to serdesAI [`ToolError`][serdes] with tool name context. /// /// [core]: llm_coding_tools_core::ToolError diff --git a/src/llm-coding-tools-serdesai/src/lib.rs b/src/llm-coding-tools-serdesai/src/lib.rs index e821d2b8..e696c39d 100644 --- a/src/llm-coding-tools-serdesai/src/lib.rs +++ b/src/llm-coding-tools-serdesai/src/lib.rs @@ -5,6 +5,7 @@ pub mod absolute; pub mod agent_ext; pub mod allowed; pub mod bash; +mod common; pub mod convert; pub mod todo; pub mod webfetch;