cdefmt_decoder/
log.rs

1//! Log related logic.
2//!
3//! The logic contained within this file relates to using a log id to extract and parse the log's
4//! information from the elf.
5
6use cdefmt_parser::metadata::{Level, Metadata};
7use rformat::{fmt::format::format_string, prelude::*};
8
9use crate::{var::Var, Result};
10
11#[derive(Clone, Debug)]
12pub struct Log<'elf> {
13    metadata: Metadata<'elf>,
14    args: Vec<Var>,
15}
16
17impl<'elf> Log<'elf> {
18    pub(crate) fn new(metadata: Metadata<'elf>, args: Vec<Var>) -> Self {
19        Self { metadata, args }
20    }
21
22    pub fn get_level(&self) -> Level {
23        self.metadata.level
24    }
25
26    pub fn get_file(&self) -> &str {
27        self.metadata.file
28    }
29
30    pub fn get_line(&self) -> usize {
31        self.metadata.line
32    }
33
34    pub fn get_args(&self) -> &[Var] {
35        &self.args
36    }
37}
38
39impl Log<'_> {
40    pub fn to_string(&self) -> Result<String> {
41        let params = self
42            .args
43            .iter()
44            .zip(self.metadata.names.iter())
45            .map(|(a, n)| rformat::fmt::format::Parameter {
46                identifier: n,
47                formattable: rformat::formattable::into_formattable!((*a)),
48            })
49            .collect::<Vec<_>>();
50
51        Ok(format_string(self.metadata.fmt, &params)?)
52    }
53}