use rusty_claw::prelude::*;
use tokio_stream::StreamExt;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
println!("=== Rusty Claw Interactive Client Example ===\n");
let options = ClaudeAgentOptions::builder()
.max_turns(10) .permission_mode(PermissionMode::AcceptEdits) .model("claude-sonnet-4-5".to_string()) .build();
println!("Creating client with options:");
println!(" - Max turns: {:?}", options.max_turns);
println!(" - Permission mode: {:?}", options.permission_mode);
println!(" - Model: {:?}", options.model);
println!();
let mut client = ClaudeClient::new(options)?;
println!("Connecting to Claude CLI...");
client.connect().await?;
println!("Connected and initialized!\n");
println!("=== Turn 1: List files ===");
let mut stream = client
.send_message("What files are in this directory?")
.await?;
while let Some(result) = stream.next().await {
match result {
Ok(Message::Assistant(msg)) => {
for block in msg.message.content {
if let ContentBlock::Text { text } = block {
println!("Claude: {}", text);
}
}
}
Ok(Message::Result(_)) => {
println!("(Turn complete)\n");
break;
}
Err(e) => {
eprintln!("Error: {}", e);
break;
}
_ => {}
}
}
println!("=== Switching to Haiku model ===");
client.set_model("claude-haiku-4-5".to_string()).await?;
println!("Model changed to claude-haiku-4-5\n");
println!("=== Turn 2: Calculate ===");
let mut stream = client.send_message("What is 42 * 137?").await?;
while let Some(result) = stream.next().await {
match result {
Ok(Message::Assistant(msg)) => {
for block in msg.message.content {
if let ContentBlock::Text { text } = block {
println!("Claude: {}", text);
}
}
}
Ok(Message::Result(_)) => {
println!("(Turn complete)\n");
break;
}
Err(e) => {
eprintln!("Error: {}", e);
break;
}
_ => {}
}
}
println!("=== Changing permission mode to Ask ===");
client.set_permission_mode(PermissionMode::Ask).await?;
println!("Permission mode changed to Ask\n");
println!("=== Turn 3: Follow-up question ===");
let mut stream = client
.send_message("What was the result of the calculation you just did?")
.await?;
while let Some(result) = stream.next().await {
match result {
Ok(Message::Assistant(msg)) => {
for block in msg.message.content {
if let ContentBlock::Text { text } = block {
println!("Claude: {}", text);
}
}
}
Ok(Message::Result(_)) => {
println!("(Turn complete)\n");
break;
}
Err(e) => {
eprintln!("Error: {}", e);
break;
}
_ => {}
}
}
println!("=== Closing session ===");
client.close().await?;
println!("Session closed gracefully");
println!("\n=== Example Complete ===");
println!("This example demonstrated:");
println!(" - Creating and connecting a ClaudeClient");
println!(" - Sending multiple messages in a conversation");
println!(" - Using control operations (set_model, set_permission_mode)");
println!(" - Maintaining conversation context across turns");
println!(" - Gracefully closing the session");
Ok(())
}