use async_trait::async_trait;
use rustyflow::error::FlowError;
use rustyflow::flow::Flow;
use rustyflow::node::Node;
use rustyflow::tool::{Tool, ToolNode};
use serde::{Deserialize, Serialize};
use serde_json::json;
#[derive(Deserialize)]
struct AddRequest {
a: i32,
b: i32,
}
#[derive(Serialize)]
struct AddResponse {
result: i32,
}
struct AddTool;
#[async_trait]
impl Tool for AddTool {
type Input = AddRequest;
type Output = AddResponse;
async fn run(&self, input: Self::Input) -> Result<Self::Output, FlowError> {
let result = input.a + input.b;
println!("AddTool executed: {} + {} = {}", input.a, input.b, result);
Ok(AddResponse { result })
}
}
#[tokio::main]
async fn main() {
let add_tool = AddTool;
let tool_node: Box<dyn Node> = Box::new(ToolNode::new(add_tool));
let flow = Flow::new(vec![tool_node]);
let initial_input = json!({ "a": 10, "b": 5 });
println!("Starting tool node flow...");
println!("Initial Input: {initial_input}");
match flow.execute(initial_input).await {
Ok(output) => {
println!("\nTool flow executed successfully!");
println!(
"Output:\n{}",
serde_json::to_string_pretty(&output).unwrap()
);
}
Err(e) => {
eprintln!("Error executing tool flow: {e}");
}
}
}