reimbursement_builder/
reimbursement_builder.rs1use a2a_agents::{
7 agents::reimbursement::ReimbursementHandler,
8 core::{AgentBuilder, BuildError},
9};
10use a2a_rs::adapter::storage::SqlxTaskStorage;
11use std::env;
12
13#[tokio::main]
14async fn main() -> Result<(), Box<dyn std::error::Error>> {
15 dotenvy::dotenv().ok();
17
18 tracing_subscriber::fmt()
20 .with_env_filter(
21 tracing_subscriber::EnvFilter::from_default_env()
22 .add_directive(tracing::Level::INFO.into()),
23 )
24 .init();
25
26 println!("🚀 Starting Reimbursement Agent with Builder API");
27 println!();
28
29 let database_url =
31 env::var("DATABASE_URL").unwrap_or_else(|_| "sqlite:reimbursement_tasks.db".to_string());
32
33 let migrations = &[include_str!("../migrations/001_create_reimbursements.sql")];
35 let storage = SqlxTaskStorage::with_migrations(&database_url, migrations)
36 .await
37 .map_err(|e| format!("Failed to create storage: {}", e))?;
38
39 let handler = ReimbursementHandler::new(storage.clone());
41
42 AgentBuilder::from_file("reimbursement.toml")?
46 .with_config(|config| {
47 if let Ok(port) = env::var("HTTP_PORT") {
49 if let Ok(port_num) = port.parse() {
50 config.server.http_port = port_num;
51 }
52 }
53 if let Ok(port) = env::var("WS_PORT") {
54 if let Ok(port_num) = port.parse() {
55 config.server.ws_port = port_num;
56 }
57 }
58 })
59 .with_handler(handler)
60 .with_storage(storage)
61 .build()?
62 .run()
63 .await
64 .map_err(|e| BuildError::RuntimeError(e.to_string()))?;
65
66 Ok(())
67}