use crate::types::{ContentBlock, Message};
pub fn extract_text_response(message: &Message) -> Option<String> {
message.content.iter().find_map(|c| {
if let ContentBlock::Text(t) = c {
Some(t.clone())
} else {
None
}
})
}
#[cfg(test)]
mod tests {
use super::*;
use crate::types::{Role, ToolUseBlock};
#[test]
fn test_extract_text_response_with_text() {
let message = Message {
role: Role::Assistant,
content: vec![ContentBlock::Text("Hello, world!".to_string())],
};
assert_eq!(
extract_text_response(&message),
Some("Hello, world!".to_string())
);
}
#[test]
fn test_extract_text_response_empty() {
let message = Message {
role: Role::Assistant,
content: vec![],
};
assert_eq!(extract_text_response(&message), None);
}
#[test]
fn test_extract_text_response_multiple_text_blocks() {
let message = Message {
role: Role::Assistant,
content: vec![
ContentBlock::Text("First".to_string()),
ContentBlock::Text("Second".to_string()),
],
};
assert_eq!(extract_text_response(&message), Some("First".to_string()));
}
#[test]
fn test_extract_text_response_tool_use_before_text() {
let message = Message {
role: Role::Assistant,
content: vec![
ContentBlock::ToolUse(ToolUseBlock {
id: "1".to_string(),
name: "tool".to_string(),
input: serde_json::json!({}),
}),
ContentBlock::Text("after tool".to_string()),
],
};
assert_eq!(
extract_text_response(&message),
Some("after tool".to_string())
);
}
#[test]
fn test_extract_text_response_only_tool_use() {
let message = Message {
role: Role::Assistant,
content: vec![ContentBlock::ToolUse(ToolUseBlock {
id: "1".to_string(),
name: "search".to_string(),
input: serde_json::json!({"query": "rust"}),
})],
};
assert_eq!(extract_text_response(&message), None);
}
#[test]
fn test_extract_text_response_thinking_then_text() {
let message = Message {
role: Role::Assistant,
content: vec![
ContentBlock::Thinking {
thinking: "reasoning about the problem".to_string(),
signature: "sig123".to_string(),
},
ContentBlock::Text("The answer is 42".to_string()),
],
};
assert_eq!(
extract_text_response(&message),
Some("The answer is 42".to_string())
);
}
#[test]
fn test_extract_text_response_mixed_content_text_first() {
let message = Message {
role: Role::Assistant,
content: vec![
ContentBlock::Text("I'll help you".to_string()),
ContentBlock::ToolUse(ToolUseBlock {
id: "1".to_string(),
name: "read_file".to_string(),
input: serde_json::json!({"path": "/tmp/test"}),
}),
ContentBlock::Text("Here's what I found".to_string()),
],
};
assert_eq!(
extract_text_response(&message),
Some("I'll help you".to_string())
);
}
}