hyperlight_common/flatbuffer_wrappers/
guest_log_level.rs

1/*
2Copyright 2025  The Hyperlight Authors.
3
4Licensed under the Apache License, Version 2.0 (the "License");
5you may not use this file except in compliance with the License.
6You may obtain a copy of the License at
7
8    http://www.apache.org/licenses/LICENSE-2.0
9
10Unless required by applicable law or agreed to in writing, software
11distributed under the License is distributed on an "AS IS" BASIS,
12WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13See the License for the specific language governing permissions and
14limitations under the License.
15*/
16
17use anyhow::{Error, Result, bail};
18use log::Level;
19#[cfg(feature = "tracing")]
20use tracing::{Span, instrument};
21
22use crate::flatbuffers::hyperlight::generated::LogLevel as FbLogLevel;
23
24#[repr(u8)]
25#[derive(Copy, Clone, Eq, PartialEq, Debug)]
26pub enum LogLevel {
27    Trace = 0,
28    Debug = 1,
29    Information = 2,
30    Warning = 3,
31    Error = 4,
32    Critical = 5,
33    None = 6,
34}
35
36impl From<u8> for LogLevel {
37    #[cfg_attr(feature = "tracing", instrument(skip_all, parent = Span::current(), level= "Trace"))]
38    fn from(val: u8) -> LogLevel {
39        match val {
40            0 => LogLevel::Trace,
41            1 => LogLevel::Debug,
42            2 => LogLevel::Information,
43            3 => LogLevel::Warning,
44            4 => LogLevel::Error,
45            5 => LogLevel::Critical,
46            _ => LogLevel::None,
47        }
48    }
49}
50
51impl TryFrom<&FbLogLevel> for LogLevel {
52    type Error = Error;
53    #[cfg_attr(feature = "tracing", instrument(err(Debug), skip_all, parent = Span::current(), level= "Trace"))]
54    fn try_from(val: &FbLogLevel) -> Result<LogLevel> {
55        match *val {
56            FbLogLevel::Trace => Ok(LogLevel::Trace),
57            FbLogLevel::Debug => Ok(LogLevel::Debug),
58            FbLogLevel::Information => Ok(LogLevel::Information),
59            FbLogLevel::Warning => Ok(LogLevel::Warning),
60            FbLogLevel::Error => Ok(LogLevel::Error),
61            FbLogLevel::Critical => Ok(LogLevel::Critical),
62            FbLogLevel::None => Ok(LogLevel::None),
63            _ => {
64                bail!("Unsupported Flatbuffers log level: {:?}", val);
65            }
66        }
67    }
68}
69
70impl From<&LogLevel> for FbLogLevel {
71    #[cfg_attr(feature = "tracing", instrument(skip_all, parent = Span::current(), level= "Trace"))]
72    fn from(val: &LogLevel) -> FbLogLevel {
73        match val {
74            LogLevel::Critical => FbLogLevel::Critical,
75            LogLevel::Debug => FbLogLevel::Debug,
76            LogLevel::Error => FbLogLevel::Error,
77            LogLevel::Information => FbLogLevel::Information,
78            LogLevel::None => FbLogLevel::None,
79            LogLevel::Trace => FbLogLevel::Trace,
80            LogLevel::Warning => FbLogLevel::Warning,
81        }
82    }
83}
84
85impl From<&LogLevel> for Level {
86    // There is a test (sandbox::outb::tests::test_log_outb_log) which emits trace record as logs
87    // which causes a panic when this function is instrumented as the logger is contained in refcell and
88    // instrumentation ends up causing a double mutborrow. So this is not instrumented.
89    //TODO: instrument this once we fix the test
90    fn from(val: &LogLevel) -> Level {
91        match val {
92            LogLevel::Trace => Level::Trace,
93            LogLevel::Debug => Level::Debug,
94            LogLevel::Information => Level::Info,
95            LogLevel::Warning => Level::Warn,
96            LogLevel::Error => Level::Error,
97            LogLevel::Critical => Level::Error,
98            // If the log level is None then we will log as trace
99            LogLevel::None => Level::Trace,
100        }
101    }
102}
103
104impl From<Level> for LogLevel {
105    fn from(val: Level) -> LogLevel {
106        match val {
107            Level::Trace => LogLevel::Trace,
108            Level::Debug => LogLevel::Debug,
109            Level::Info => LogLevel::Information,
110            Level::Warn => LogLevel::Warning,
111            Level::Error => LogLevel::Error,
112        }
113    }
114}