use serde_json::Value;
#[derive(Debug, Clone, PartialEq)]
pub struct ToolCall {
pub name: String,
pub args: Value,
}
pub trait OutputParser: Send + Sync {
fn parse(&self, content: &str) -> Option<ToolCall>;
}
pub struct JsonParser;
impl OutputParser for JsonParser {
fn parse(&self, content: &str) -> Option<ToolCall> {
let json_str = if let Some(start) = content.find("```json") {
if let Some(end) = content[start+7..].find("```") {
let s = &content[start+7..start+7+end];
s.trim()
} else {
content
}
} else {
content
};
if let Ok(val) = serde_json::from_str::<Value>(json_str) {
if let Some(obj) = val.as_object() {
if let (Some(name), Some(args)) = (obj.get("tool"), obj.get("args")) {
if let Some(name_str) = name.as_str() {
return Some(ToolCall {
name: name_str.to_string(),
args: args.clone(),
});
}
}
}
}
None
}
}