use serializable_log_record::SerializableLogRecord;
use super::{PubSubEncoder, Record, StreamEncoder};
#[derive(Debug)]
#[non_exhaustive]
pub struct DefaultPubSubEncoder {}
impl DefaultPubSubEncoder {
pub const fn new() -> Self {
Self {}
}
}
impl PubSubEncoder for DefaultPubSubEncoder {
fn encode(&self, record: &Record) -> Vec<u8> {
let ser_record = SerializableLogRecord::from(record);
serde_json::to_string(&ser_record).unwrap().into_bytes()
}
}
#[derive(Debug)]
#[non_exhaustive]
pub struct DefaultStreamEncoder {}
impl DefaultStreamEncoder {
pub const fn new() -> Self {
Self {}
}
}
impl StreamEncoder for DefaultStreamEncoder {
fn encode(&self, record: &Record) -> Vec<(String, Vec<u8>)> {
let ser_record = SerializableLogRecord::from(record);
serde_json::to_value(&ser_record)
.unwrap_or_else(|_| serde_json::json!({}))
.as_object()
.unwrap()
.iter()
.map(|(k, v)| (k.clone(), v.as_str().unwrap_or("").to_owned().into_bytes()))
.collect()
}
}
#[cfg(test)]
mod tests {
use super::*;
use log::Level;
#[test]
fn test_default_pubsub_encoder_encode() {
let encoder = DefaultPubSubEncoder::new();
let record = Record::builder()
.level(Level::Info)
.args(format_args!("Test message"))
.target("my_target")
.module_path(Some("my_module"))
.file(Some("my_file.rs"))
.line(Some(42))
.build();
let expected = r#"{"level":"INFO","args":"Test message","target":"my_target","module_path":"my_module","file":"my_file.rs","line":42}"#;
let expected_bytes = expected.as_bytes().to_vec();
assert_eq!(encoder.encode(&record), expected_bytes);
}
#[test]
fn test_default_stream_encoder_encode() {
let encoder = DefaultStreamEncoder::new();
let record = Record::builder()
.level(Level::Error)
.args(format_args!("Error message"))
.target("my_target")
.module_path(None)
.file(Some("my_file.rs"))
.line(None)
.build();
let expected = vec![
("args".to_owned(), b"Error message".to_vec()),
("file".to_owned(), b"my_file.rs".to_vec()),
("level".to_owned(), b"ERROR".to_vec()),
("line".to_owned(), b"".to_vec()),
("module_path".to_owned(), b"".to_vec()),
("target".to_owned(), b"my_target".to_vec()),
];
assert_eq!(encoder.encode(&record), expected);
}
}