use std::io::Write; use crate::message::json::message_to_json_value; use crate::message::{Emitter, EmitterContext, Message}; #[derive(Default)] pub struct JsonLinesEmitter; impl Emitter for JsonLinesEmitter { fn emit( &mut self, writer: &mut dyn Write, messages: &[Message], context: &EmitterContext, ) -> anyhow::Result<()> { for message in messages { serde_json::to_writer(&mut *writer, &message_to_json_value(message, context))?; writer.write_all(b"\n")?; } Ok(()) } } #[cfg(test)] mod tests { use insta::assert_snapshot; use crate::message::json_lines::JsonLinesEmitter; use crate::message::tests::{ capture_emitter_notebook_output, capture_emitter_output, create_messages, create_notebook_messages, create_syntax_error_messages, }; #[test] fn output() { let mut emitter = JsonLinesEmitter; let content = capture_emitter_output(&mut emitter, &create_messages()); assert_snapshot!(content); } #[test] fn syntax_errors() { let mut emitter = JsonLinesEmitter; let content = capture_emitter_output(&mut emitter, &create_syntax_error_messages()); assert_snapshot!(content); } #[test] fn notebook_output() { let mut emitter = JsonLinesEmitter; let (messages, notebook_indexes) = create_notebook_messages(); let content = capture_emitter_notebook_output(&mut emitter, &messages, ¬ebook_indexes); assert_snapshot!(content); } }