use std::io::IoSlice;
use log::{kv, Record};
use crate::format::json;
use crate::format::{Buffer, Format, BUFS_SIZE};
use crate::PANIC_TARGET;
#[allow(missing_debug_implementations)]
pub enum Gcloud {}
impl Format for Gcloud {
fn format<'b, Kvs: kv::Source>(
bufs: &'b mut [IoSlice<'b>; BUFS_SIZE],
buf: &'b mut Buffer,
record: &'b Record,
kvs: &Kvs,
add_loc: bool,
) -> &'b [IoSlice<'b>] {
buf.buf[0] = b'{';
#[cfg(feature = "timestamp")]
json::write_timestamp(buf);
json::write_msg(buf, record.args());
json::write_key_values(buf, record.key_values(), kvs);
if add_loc {
json::write_line(buf, record.line().unwrap_or(0));
}
bufs[0] = IoSlice::new(json::timestamp(buf));
bufs[1] = IoSlice::new(b"\"severity\":\"");
if record.level() == log::Level::Error && record.target() == PANIC_TARGET {
bufs[2] = IoSlice::new(b"CRITICAL");
} else {
bufs[2] = IoSlice::new(severity(record.level()));
}
bufs[3] = IoSlice::new(b"\",\"message\":\"");
bufs[4] = IoSlice::new(json::msg(buf));
bufs[5] = IoSlice::new(b"\",\"target\":\"");
bufs[6] = IoSlice::new(record.target().as_bytes());
bufs[7] = IoSlice::new(b"\",\"module\":\"");
bufs[8] = IoSlice::new(record.module_path().unwrap_or("").as_bytes());
bufs[9] = IoSlice::new(json::key_values(buf));
let n = if add_loc {
bufs[10] = IoSlice::new(b",\"sourceLocation\":{\"file\":\"");
bufs[11] = IoSlice::new(record.file().unwrap_or("??").as_bytes());
bufs[12] = IoSlice::new(b"\",\"line\":\"");
bufs[13] = IoSlice::new(json::line(buf));
bufs[14] = IoSlice::new(b"\"}}\n");
15
} else {
bufs[10] = IoSlice::new(b"}\n");
11
};
&bufs[..n]
}
}
#[inline]
const fn severity(level: log::Level) -> &'static [u8] {
const SEVERITIES: [&[u8]; 6] = [b"OFF", b"ERROR", b"WARNING", b"INFO", b"DEBUG", b"DEBUG"];
SEVERITIES[level as usize]
}