claude_agent_sdk/message/parser.rs
1//! Message parser for Claude Code SDK responses
2
3use crate::error::{ClaudeError, Result};
4use crate::types::Message;
5
6/// Parse a JSON value into a typed Message
7///
8/// # Arguments
9/// * `data` - Raw JSON value from CLI output
10///
11/// # Returns
12/// Parsed Message object or error
13///
14/// # Errors
15/// Returns `ClaudeError::MessageParse` if the JSON cannot be parsed into a valid Message
16///
17/// # Security Note
18/// For additional security against deeply nested JSON attacks, consider using
19/// `serde_json::Deserializer::with_recursion_limit()` to set explicit depth limits.
20/// This is not currently implemented to avoid additional complexity, but the current
21/// timeout mechanism on read operations provides some protection against excessive
22/// parsing time.
23pub fn parse_message(data: serde_json::Value) -> Result<Message> {
24 serde_json::from_value(data.clone()).map_err(|e| {
25 ClaudeError::message_parse(format!("Failed to parse message: {e}"), Some(data))
26 })
27}
28
29#[cfg(test)]
30mod tests {
31 use super::*;
32 use serde_json::json;
33
34 #[test]
35 fn test_parse_user_message() {
36 let data = json!({
37 "type": "user",
38 "message": {
39 "role": "user",
40 "content": "Hello, Claude!"
41 }
42 });
43
44 let result = parse_message(data);
45 assert!(result.is_ok());
46 }
47
48 #[test]
49 fn test_parse_invalid_message() {
50 let data = json!({
51 "type": "invalid_type",
52 "data": "some data"
53 });
54
55 let result = parse_message(data);
56 assert!(result.is_err());
57 }
58}