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}