hyperlight_common/flatbuffer_wrappers/
guest_log_data.rs1use alloc::string::{String, ToString};
18use alloc::vec::Vec;
19
20use anyhow::{Error, Result, anyhow};
21use flatbuffers::size_prefixed_root;
22#[cfg(feature = "tracing")]
23use tracing::{Span, instrument};
24
25use super::guest_log_level::LogLevel;
26use crate::flatbuffers::hyperlight::generated::{
27 GuestLogData as FbGuestLogData, GuestLogDataArgs as FbGuestLogDataArgs, LogLevel as FbLogLevel,
28};
29
30#[derive(Eq, PartialEq, Debug, Clone)]
32#[allow(missing_docs)]
33pub struct GuestLogData {
34 pub message: String,
35 pub source: String,
36 pub level: LogLevel,
37 pub caller: String,
38 pub source_file: String,
39 pub line: u32,
40}
41
42impl GuestLogData {
43 #[cfg_attr(feature = "tracing", instrument(skip_all, parent = Span::current(), level= "Trace"))]
44 pub fn new(
45 message: String,
46 source: String,
47 level: LogLevel,
48 caller: String,
49 source_file: String,
50 line: u32,
51 ) -> Self {
52 Self {
53 message,
54 source,
55 level,
56 caller,
57 source_file,
58 line,
59 }
60 }
61}
62
63impl TryFrom<&[u8]> for GuestLogData {
64 type Error = Error;
65 #[cfg_attr(feature = "tracing", instrument(err(Debug), skip_all, parent = Span::current(), level= "Trace"))]
66 fn try_from(raw_bytes: &[u8]) -> Result<Self> {
67 let gld_gen = size_prefixed_root::<FbGuestLogData>(raw_bytes)
68 .map_err(|e| anyhow!("Error while reading GuestLogData: {:?}", e))?;
69 let message = convert_generated_option("message", gld_gen.message())?;
70 let source = convert_generated_option("source", gld_gen.source())?;
71 let level = LogLevel::try_from(&gld_gen.level())?;
72 let caller = convert_generated_option("caller", gld_gen.caller())?;
73 let source_file = convert_generated_option("source file", gld_gen.source_file())?;
74 let line = gld_gen.line();
75
76 Ok(GuestLogData {
77 message,
78 source,
79 level,
80 caller,
81 source_file,
82 line,
83 })
84 }
85}
86
87impl TryFrom<&GuestLogData> for Vec<u8> {
88 type Error = Error;
89 #[cfg_attr(feature = "tracing", instrument(err(Debug), skip_all, parent = Span::current(), level= "Trace"))]
90 fn try_from(value: &GuestLogData) -> Result<Vec<u8>> {
91 let mut builder = flatbuffers::FlatBufferBuilder::new();
92 let message = builder.create_string(&value.message);
93 let source = builder.create_string(&value.source);
94 let caller = builder.create_string(&value.caller);
95 let source_file = builder.create_string(&value.source_file);
96 let level = FbLogLevel::from(&value.level);
97
98 let guest_log_data_fb = FbGuestLogData::create(
99 &mut builder,
100 &FbGuestLogDataArgs {
101 message: Some(message),
102 source: Some(source),
103 level,
104 caller: Some(caller),
105 source_file: Some(source_file),
106 line: value.line,
107 },
108 );
109 builder.finish_size_prefixed(guest_log_data_fb, None);
110 let res = builder.finished_data().to_vec();
111
112 Ok(res)
113 }
114}
115
116impl TryFrom<GuestLogData> for Vec<u8> {
117 type Error = Error;
118 #[cfg_attr(feature = "tracing", instrument(err(Debug), skip_all, parent = Span::current(), level= "Trace"))]
119 fn try_from(value: GuestLogData) -> Result<Vec<u8>> {
120 (&value).try_into()
121 }
122}
123
124#[cfg_attr(feature = "tracing", instrument(err(Debug), skip_all, parent = Span::current(), level= "Trace"))]
125fn convert_generated_option(field_name: &str, opt: Option<&str>) -> Result<String> {
126 opt.map(|s| s.to_string())
127 .ok_or_else(|| anyhow!("Missing field: {}", field_name))
128}