Skip to main content

hyperlight_common/flatbuffer_wrappers/
guest_log_level.rs

1// SPDX-License-Identifier: Apache-2.0
2// Copyright 2025 The Hyperlight Authors.
3
4use anyhow::{Error, Result, bail};
5use log::Level;
6#[cfg(feature = "tracing")]
7use tracing::{Span, instrument};
8
9use crate::flatbuffers::hyperlight::generated::LogLevel as FbLogLevel;
10
11#[repr(u8)]
12#[derive(Copy, Clone, Eq, PartialEq, Debug)]
13pub enum LogLevel {
14    Trace = 0,
15    Debug = 1,
16    Information = 2,
17    Warning = 3,
18    Error = 4,
19    Critical = 5,
20    None = 6,
21}
22
23impl From<u8> for LogLevel {
24    #[cfg_attr(feature = "tracing", instrument(skip_all, parent = Span::current(), level= "Trace"))]
25    fn from(val: u8) -> LogLevel {
26        match val {
27            0 => LogLevel::Trace,
28            1 => LogLevel::Debug,
29            2 => LogLevel::Information,
30            3 => LogLevel::Warning,
31            4 => LogLevel::Error,
32            5 => LogLevel::Critical,
33            _ => LogLevel::None,
34        }
35    }
36}
37
38impl TryFrom<&FbLogLevel> for LogLevel {
39    type Error = Error;
40    #[cfg_attr(feature = "tracing", instrument(err(Debug), skip_all, parent = Span::current(), level= "Trace"))]
41    fn try_from(val: &FbLogLevel) -> Result<LogLevel> {
42        match *val {
43            FbLogLevel::Trace => Ok(LogLevel::Trace),
44            FbLogLevel::Debug => Ok(LogLevel::Debug),
45            FbLogLevel::Information => Ok(LogLevel::Information),
46            FbLogLevel::Warning => Ok(LogLevel::Warning),
47            FbLogLevel::Error => Ok(LogLevel::Error),
48            FbLogLevel::Critical => Ok(LogLevel::Critical),
49            FbLogLevel::None => Ok(LogLevel::None),
50            _ => {
51                bail!("Unsupported Flatbuffers log level: {:?}", val);
52            }
53        }
54    }
55}
56
57impl From<&LogLevel> for FbLogLevel {
58    #[cfg_attr(feature = "tracing", instrument(skip_all, parent = Span::current(), level= "Trace"))]
59    fn from(val: &LogLevel) -> FbLogLevel {
60        match val {
61            LogLevel::Critical => FbLogLevel::Critical,
62            LogLevel::Debug => FbLogLevel::Debug,
63            LogLevel::Error => FbLogLevel::Error,
64            LogLevel::Information => FbLogLevel::Information,
65            LogLevel::None => FbLogLevel::None,
66            LogLevel::Trace => FbLogLevel::Trace,
67            LogLevel::Warning => FbLogLevel::Warning,
68        }
69    }
70}
71
72impl From<&LogLevel> for Level {
73    // There is a test (sandbox::outb::tests::test_log_outb_log) which emits trace record as logs
74    // which causes a panic when this function is instrumented as the logger is contained in refcell and
75    // instrumentation ends up causing a double mutborrow. So this is not instrumented.
76    //TODO: instrument this once we fix the test
77    fn from(val: &LogLevel) -> Level {
78        match val {
79            LogLevel::Trace => Level::Trace,
80            LogLevel::Debug => Level::Debug,
81            LogLevel::Information => Level::Info,
82            LogLevel::Warning => Level::Warn,
83            LogLevel::Error => Level::Error,
84            LogLevel::Critical => Level::Error,
85            // If the log level is None then we will log as trace
86            LogLevel::None => Level::Trace,
87        }
88    }
89}
90
91impl From<Level> for LogLevel {
92    fn from(val: Level) -> LogLevel {
93        match val {
94            Level::Trace => LogLevel::Trace,
95            Level::Debug => LogLevel::Debug,
96            Level::Info => LogLevel::Information,
97            Level::Warn => LogLevel::Warning,
98            Level::Error => LogLevel::Error,
99        }
100    }
101}