1use log::{Level, Log, Record};
2use serde::{Deserialize, Serialize};
3
4#[derive(Deserialize, Debug, Serialize)]
5pub struct LogRecord<'a> {
6 pub level: usize,
7 pub module_path: Option<&'a str>,
8 pub file: Option<&'a str>,
9 pub line: Option<u32>,
10 pub message: String,
11}
12
13impl<'a> LogRecord<'a> {
14 pub fn new(record: &'a Record<'a>) -> Self {
15 Self {
16 level: serialize_level(record.level()),
17 module_path: record.module_path(),
18 file: record.file(),
19 line: record.line(),
20 message: record.args().to_string(),
21 }
22 }
23
24 pub fn log(&'a self, logger: &dyn Log) {
25 if let Some(level) = deserialize_level(self.level) {
26 logger.log(
27 &log::Record::builder()
28 .module_path(self.module_path)
29 .target("remote_server")
30 .args(format_args!("{}", self.message))
31 .file(self.file)
32 .line(self.line)
33 .level(level)
34 .build(),
35 )
36 }
37 }
38}
39
40fn serialize_level(level: Level) -> usize {
41 match level {
42 Level::Error => 1,
43 Level::Warn => 2,
44 Level::Info => 3,
45 Level::Debug => 4,
46 Level::Trace => 5,
47 }
48}
49
50fn deserialize_level(level: usize) -> Option<Level> {
51 match level {
52 1 => Some(Level::Error),
53 2 => Some(Level::Warn),
54 3 => Some(Level::Info),
55 4 => Some(Level::Debug),
56 5 => Some(Level::Trace),
57 _ => None,
58 }
59}