use caliban_agent_core::ToolError;
use serde::de::DeserializeOwned;
use serde_json::Value;
pub fn parse_input<T: DeserializeOwned>(input: Value) -> Result<T, ToolError> {
serde_json::from_value(input).map_err(|e| ToolError::invalid_input(e.to_string()))
}
#[cfg(test)]
mod tests {
use super::*;
use serde::Deserialize;
use serde_json::json;
#[derive(Debug, Deserialize)]
struct Demo {
name: String,
}
#[test]
fn parses_valid_input() {
let v: Demo = parse_input(json!({ "name": "x" })).unwrap();
assert_eq!(v.name, "x");
}
#[test]
fn maps_failure_to_invalid_input_without_doubled_prefix() {
let err = parse_input::<Demo>(json!({ "name": 5 })).unwrap_err();
assert!(matches!(err, ToolError::InvalidInput(_)));
let shown = err.to_string();
assert!(shown.starts_with("invalid input: "), "got {shown:?}");
assert!(
!shown.contains("invalid input: invalid input:"),
"doubled prefix: {shown:?}",
);
}
}