use claude_agent_sdk::{ClaudeAgentOptions, ContentBlock, Message, query};
use std::collections::HashMap;
use std::sync::{Arc, Mutex};
#[tokio::main]
async fn main() -> anyhow::Result<()> {
println!("=== Stderr Callback Example ===\n");
let stderr_messages = Arc::new(Mutex::new(Vec::new()));
let stderr_messages_clone = stderr_messages.clone();
let stderr_callback = move |message: String| {
stderr_messages_clone.lock().unwrap().push(message.clone());
if message.contains("[ERROR]") {
println!("Error detected: {}", message);
}
};
let mut extra_args = HashMap::new();
extra_args.insert("debug-to-stderr".to_string(), None);
let options = ClaudeAgentOptions {
stderr_callback: Some(Arc::new(stderr_callback)),
extra_args,
max_turns: Some(3),
..Default::default()
};
println!("Running query with stderr capture...\n");
let messages = query("What is 2+2?", Some(options)).await?;
for message in &messages {
if let Message::Assistant(msg) = message {
for block in &msg.message.content {
if let ContentBlock::Text(text) = block {
println!("Response: {}", text.text);
}
}
}
}
let captured = stderr_messages.lock().unwrap();
println!("\nCaptured {} stderr lines", captured.len());
if !captured.is_empty() {
println!(
"First stderr line: {}",
&captured[0][..100.min(captured[0].len())]
);
}
Ok(())
}