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}