use serde_json::Value;
pub fn parse_raw_line(line: &str) -> Value {
if line.trim().is_empty() {
return Value::Null;
}
serde_json::from_str(line.trim()).unwrap_or_else(|_| Value::String(line.to_owned()))
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn harness_lines_pass_through_verbatim() {
let v = parse_raw_line(r#"{"type":"init","session_id":"s","model":"premium"}"#);
assert_eq!(v["type"].as_str(), Some("init"));
assert_eq!(v["session_id"].as_str(), Some("s"));
let v = parse_raw_line(
r#"{"type":"stream_event","event":{"type":"content_block_delta","delta":{"type":"text_delta","text":"hi"}}}"#,
);
assert_eq!(v["event"]["delta"]["text"].as_str(), Some("hi"));
let v = parse_raw_line(
r#"{"type":"item.completed","item":{"id":"i2","type":"command_execution","exit_code":0}}"#,
);
assert_eq!(v["item"]["type"].as_str(), Some("command_execution"));
assert_eq!(v["item"]["exit_code"].as_i64(), Some(0));
}
#[test]
fn arrays_and_scalars_pass_through() {
assert_eq!(parse_raw_line("[1,2,3]")[1].as_i64(), Some(2));
assert_eq!(parse_raw_line("42").as_i64(), Some(42));
assert_eq!(parse_raw_line("true").as_bool(), Some(true));
}
#[test]
fn blank_line_is_null() {
assert_eq!(parse_raw_line(" "), Value::Null);
}
#[test]
fn non_json_line_is_preserved_verbatim() {
assert_eq!(
parse_raw_line(" hello world "),
Value::String(" hello world ".to_owned())
);
}
#[test]
fn unknown_type_passes_through_untouched() {
let v = parse_raw_line(r#"{"type":"telemetry","foo":42}"#);
assert_eq!(v["type"].as_str(), Some("telemetry"));
assert_eq!(v["foo"].as_i64(), Some(42));
}
#[test]
fn unknown_field_on_known_type_is_kept() {
let v = parse_raw_line(r#"{"type":"message","content":"hi","usage":{"out":7}}"#);
assert_eq!(v["content"].as_str(), Some("hi"));
assert_eq!(v["usage"]["out"].as_i64(), Some(7)); }
#[test]
fn empty_string_fields_are_kept() {
let v = parse_raw_line(r#"{"type":"message","content":""}"#);
assert_eq!(v["content"].as_str(), Some(""));
}
}