use opencode_rs::ClientBuilder;
use opencode_rs::types::event::Event;
use opencode_rs::types::message::{PromptPart, PromptRequest};
use opencode_rs::types::session::CreateSessionRequest;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
tracing_subscriber::fmt::init();
let client = ClientBuilder::new().build()?;
let session = client
.sessions()
.create(&CreateSessionRequest::default())
.await?;
println!("Created session: {}", session.id);
let mut subscription = client.subscribe_session(&session.id)?;
println!("Subscribed to events");
client
.messages()
.prompt(
&session.id,
&PromptRequest {
parts: vec![PromptPart::Text {
text: "Write a haiku about Rust programming".into(),
synthetic: None,
ignored: None,
metadata: None,
}],
message_id: None,
model: None,
agent: None,
no_reply: None,
system: None,
variant: None,
},
)
.await?;
println!("Prompt sent, streaming events...\n");
loop {
match subscription.recv().await {
Some(Event::SessionIdle { .. }) => {
println!("\n[Session completed]");
break;
}
Some(Event::SessionError { properties }) => {
eprintln!("\n[Session error: {:?}]", properties.error);
break;
}
Some(Event::MessagePartUpdated { properties }) => {
if let Some(delta) = &properties.delta {
print!("{delta}");
}
}
Some(Event::ServerHeartbeat { .. }) => {
}
Some(event) => {
println!("[Event: {event:?}]");
}
None => {
println!("[Stream closed]");
break;
}
}
}
client.sessions().delete(&session.id).await?;
println!("Session deleted");
Ok(())
}