use crate::error::{ClaudeSDKError, Result};
use crate::types::Message;
const KNOWN_TYPES: &[&str] = &["user", "assistant", "system", "result", "stream_event"];
pub fn parse_message(value: serde_json::Value) -> Result<Message> {
if let Some(msg_type) = value.get("type").and_then(|v| v.as_str())
&& !KNOWN_TYPES.contains(&msg_type)
{
return Err(ClaudeSDKError::UnknownMessageType(msg_type.to_string()));
}
serde_json::from_value(value).map_err(|e| ClaudeSDKError::message_parse(e.to_string()))
}
#[cfg(test)]
mod tests {
use super::*;
use serde_json::json;
#[test]
fn test_parse_assistant_message() {
let json = json!({
"type": "assistant",
"message": {
"content": [
{"type": "text", "text": "Hello!"}
],
"model": "claude-sonnet-4-5"
}
});
let msg = parse_message(json).unwrap();
assert!(msg.is_assistant());
}
#[test]
fn test_parse_result_message() {
let json = json!({
"type": "result",
"subtype": "success",
"duration_ms": 1000,
"duration_api_ms": 800,
"is_error": false,
"num_turns": 1,
"session_id": "test",
"total_cost_usd": 0.01
});
let msg = parse_message(json).unwrap();
assert!(msg.is_result());
}
#[test]
fn test_skip_unknown_message_type() {
let json = json!({
"type": "rate_limit_event",
"data": {}
});
let result = parse_message(json);
assert!(matches!(result, Err(ClaudeSDKError::UnknownMessageType(_))));
}
}