hyperlight_common/
log_level.rs1#[derive(Debug, Clone, Copy, PartialEq, Eq)]
27pub enum GuestLogFilter {
28 Off,
29 Error,
30 Warn,
31 Info,
32 Debug,
33 Trace,
34}
35
36impl From<GuestLogFilter> for tracing_core::LevelFilter {
37 fn from(filter: GuestLogFilter) -> Self {
38 match filter {
39 GuestLogFilter::Off => tracing_core::LevelFilter::OFF,
40 GuestLogFilter::Error => tracing_core::LevelFilter::ERROR,
41 GuestLogFilter::Warn => tracing_core::LevelFilter::WARN,
42 GuestLogFilter::Info => tracing_core::LevelFilter::INFO,
43 GuestLogFilter::Debug => tracing_core::LevelFilter::DEBUG,
44 GuestLogFilter::Trace => tracing_core::LevelFilter::TRACE,
45 }
46 }
47}
48
49impl From<GuestLogFilter> for log::LevelFilter {
50 fn from(filter: GuestLogFilter) -> Self {
51 match filter {
52 GuestLogFilter::Off => log::LevelFilter::Off,
53 GuestLogFilter::Error => log::LevelFilter::Error,
54 GuestLogFilter::Warn => log::LevelFilter::Warn,
55 GuestLogFilter::Info => log::LevelFilter::Info,
56 GuestLogFilter::Debug => log::LevelFilter::Debug,
57 GuestLogFilter::Trace => log::LevelFilter::Trace,
58 }
59 }
60}
61
62impl From<tracing_core::LevelFilter> for GuestLogFilter {
65 fn from(value: tracing_core::LevelFilter) -> Self {
66 match value {
67 tracing_core::LevelFilter::OFF => Self::Off,
68 tracing_core::LevelFilter::ERROR => Self::Error,
69 tracing_core::LevelFilter::WARN => Self::Warn,
70 tracing_core::LevelFilter::INFO => Self::Info,
71 tracing_core::LevelFilter::DEBUG => Self::Debug,
72 tracing_core::LevelFilter::TRACE => Self::Trace,
73 }
74 }
75}
76
77impl TryFrom<u64> for GuestLogFilter {
81 type Error = ();
82
83 fn try_from(value: u64) -> Result<Self, <GuestLogFilter as TryFrom<u64>>::Error> {
84 match value {
85 0 => Ok(Self::Off),
86 1 => Ok(Self::Error),
87 2 => Ok(Self::Warn),
88 3 => Ok(Self::Info),
89 4 => Ok(Self::Debug),
90 5 => Ok(Self::Trace),
91 _ => Err(()),
92 }
93 }
94}
95
96impl From<GuestLogFilter> for u64 {
99 fn from(value: GuestLogFilter) -> Self {
100 match value {
101 GuestLogFilter::Off => 0,
102 GuestLogFilter::Error => 1,
103 GuestLogFilter::Warn => 2,
104 GuestLogFilter::Info => 3,
105 GuestLogFilter::Debug => 4,
106 GuestLogFilter::Trace => 5,
107 }
108 }
109}
110
111#[cfg(test)]
112mod tests {
113 use super::GuestLogFilter;
114
115 #[test]
116 fn guest_log_filter_u64_roundtrip() {
117 let variants = [
118 GuestLogFilter::Off,
119 GuestLogFilter::Error,
120 GuestLogFilter::Warn,
121 GuestLogFilter::Info,
122 GuestLogFilter::Debug,
123 GuestLogFilter::Trace,
124 ];
125
126 for variant in variants {
127 let as_u64: u64 = variant.into();
128 let back =
129 GuestLogFilter::try_from(as_u64).expect("conversion from u64 should succeed");
130 assert_eq!(variant, back);
131 }
132 }
133
134 #[test]
135 fn guest_log_filter_tracing_roundtrip() {
136 let variants = [
137 GuestLogFilter::Off,
138 GuestLogFilter::Error,
139 GuestLogFilter::Warn,
140 GuestLogFilter::Info,
141 GuestLogFilter::Debug,
142 GuestLogFilter::Trace,
143 ];
144
145 for variant in variants {
146 let tracing_filter: tracing_core::LevelFilter = variant.into();
147 let back: GuestLogFilter = tracing_filter.into();
148 assert_eq!(variant, back);
149 }
150 }
151
152 #[test]
153 fn guest_log_filter_log_conversion() {
154 let variants = [
155 GuestLogFilter::Off,
156 GuestLogFilter::Error,
157 GuestLogFilter::Warn,
158 GuestLogFilter::Info,
159 GuestLogFilter::Debug,
160 GuestLogFilter::Trace,
161 ];
162
163 let log_variants = [
164 log::LevelFilter::Off,
165 log::LevelFilter::Error,
166 log::LevelFilter::Warn,
167 log::LevelFilter::Info,
168 log::LevelFilter::Debug,
169 log::LevelFilter::Trace,
170 ];
171
172 for (variant, log_variant) in variants.into_iter().zip(log_variants) {
173 let log_filter = log::LevelFilter::from(variant);
174 assert_eq!(log_filter, log_variant);
175 }
176 }
177
178 #[test]
179 fn guest_log_filter_try_from_u64_rejects_invalid() {
180 assert!(GuestLogFilter::try_from(u64::MAX).is_err());
182 assert!(GuestLogFilter::try_from(6).is_err());
183 }
184}