vv_agent/types/dict/
tools.rs1use super::common::*;
2use super::*;
3
4impl ToolExecutionResult {
5 pub fn to_dict(&self) -> Value {
6 let mut payload = serde_json::Map::from_iter([
7 (
8 "tool_call_id".to_string(),
9 Value::String(self.tool_call_id.clone()),
10 ),
11 ("content".to_string(), Value::String(self.content.clone())),
12 (
13 "directive".to_string(),
14 Value::String(tool_directive_value(self.directive).to_string()),
15 ),
16 (
17 "status".to_string(),
18 Value::String(tool_result_simple_status(self.status).to_string()),
19 ),
20 (
21 "status_code".to_string(),
22 Value::String(tool_result_status_value(self.status).to_string()),
23 ),
24 ]);
25 insert_optional_string(&mut payload, "error_code", &self.error_code);
26 if !self.metadata.is_empty() {
27 payload.insert("metadata".to_string(), metadata_to_value(&self.metadata));
28 }
29 insert_optional_string(&mut payload, "image_url", &self.image_url);
30 insert_optional_string(&mut payload, "image_path", &self.image_path);
31 Value::Object(payload)
32 }
33
34 pub fn from_dict(data: &Value) -> Result<Self, String> {
35 let object = expect_object(data, "ToolExecutionResult")?;
36 let status = match read_optional_string(object, "status_code").as_deref() {
37 Some(status_code) => parse_tool_result_status(status_code)?,
38 None => {
39 let status =
40 read_optional_string(object, "status").unwrap_or_else(|| "success".to_string());
41 parse_tool_result_status(&status)
42 .or_else(|_| parse_simple_tool_result_status(&status))?
43 }
44 };
45 Ok(Self {
46 tool_call_id: read_string(object, "tool_call_id").unwrap_or_default(),
47 content: read_string(object, "content").unwrap_or_default(),
48 status,
49 directive: parse_tool_directive(
50 read_optional_string(object, "directive")
51 .as_deref()
52 .unwrap_or("continue"),
53 )?,
54 error_code: read_optional_string(object, "error_code"),
55 metadata: read_metadata(object, "metadata")?,
56 image_url: read_optional_string(object, "image_url"),
57 image_path: read_optional_string(object, "image_path"),
58 })
59 }
60}