use std::env;
use akribes_sdk::{AkribesClient, Result, WorkflowEvent, models::ClientInterest};
#[tokio::main]
async fn main() -> Result<()> {
let base_url = env::var("AKRIBES_BASE_URL").unwrap_or_else(|_| "http://localhost:3001".into());
let project_id: i64 = env::var("AKRIBES_PROJECT_ID")
.ok()
.and_then(|s| s.parse().ok())
.unwrap_or(1);
let script_name = env::var("AKRIBES_SCRIPT_NAME").unwrap_or_else(|_| "demo_script".into());
let token = env::var("AKRIBES_TOKEN").ok();
println!("[quick_start] connecting to {base_url} (project {project_id})");
let mut builder = AkribesClient::builder(&base_url)
.project_id(project_id)
.name("rust-sdk-quick-start");
if let Some(t) = token {
builder = builder.token(t);
}
let client = builder.build();
let scripts = client.project(project_id).scripts().list().await?;
let exists = scripts.iter().any(|s| s.name == script_name);
if !exists {
println!("[quick_start] creating '{script_name}'");
let source = r#"
input
message: string
workflow
return message
"#;
client
.project(project_id)
.scripts()
.create(&script_name, source)
.await?;
}
client
.project(project_id)
.registered_clients()
.init(vec![ClientInterest {
script_name: script_name.clone(),
inputs: [("message".to_string(), "string".to_string())].into(),
channel: None,
lifetime: None,
strict: None,
}])
.await?;
println!("[quick_start] registered client (heartbeat active)");
let executions = client.project(project_id).executions();
let req = executions
.run(&script_name)
.input("message", "hello from rust");
let mut stream = executions.run_stream(req).await?;
stream.on_output(|chunk| {
if let Some(s) = chunk.as_str() {
print!("{s}");
}
});
stream.on_task_end(|p| {
println!("\n[quick_start] task '{}' done in {:?}", p.task, p.duration);
});
stream.on_error(|p| {
eprintln!("[quick_start] engine error: {} ({:?})", p.message, p.kind);
});
while let Some(evt) = stream.next().await {
match evt {
Ok(WorkflowEvent::End { output, .. }) => {
println!("\n[quick_start] workflow finished: {output}");
break;
}
Ok(_) => {}
Err(e) => {
eprintln!("[quick_start] stream error: {e}");
return Err(e);
}
}
}
client.project(project_id).registered_clients().destroy();
Ok(())
}