hyperlight_common/flatbuffer_wrappers/
host_function_details.rsuse alloc::vec::Vec;
use anyhow::{Error, Result};
use flatbuffers::{size_prefixed_root, WIPOffset};
#[cfg(feature = "tracing")]
use tracing::{instrument, Span};
use super::host_function_definition::HostFunctionDefinition;
use crate::flatbuffers::hyperlight::generated::{
HostFunctionDefinition as FbHostFunctionDefinition,
HostFunctionDetails as FbHostFunctionDetails,
HostFunctionDetailsArgs as FbHostFunctionDetailsArgs,
};
#[derive(Debug, Default, Clone)]
pub struct HostFunctionDetails {
pub host_functions: Option<Vec<HostFunctionDefinition>>,
}
impl HostFunctionDetails {
#[cfg_attr(feature = "tracing", instrument(skip_all, parent = Span::current(), level= "Trace"))]
pub fn new(host_functions: Option<Vec<HostFunctionDefinition>>) -> Self {
Self { host_functions }
}
#[cfg_attr(feature = "tracing", instrument(skip_all, parent = Span::current(), level= "Trace"))]
pub fn insert_host_function(&mut self, host_function: HostFunctionDefinition) {
match &mut self.host_functions {
Some(host_functions) => host_functions.push(host_function),
None => {
let host_functions = Vec::from(&[host_function]);
self.host_functions = Some(host_functions);
}
}
}
#[cfg_attr(feature = "tracing", instrument(skip_all, parent = Span::current(), level= "Trace"))]
pub fn sort_host_functions_by_name(&mut self) {
match &mut self.host_functions {
Some(host_functions) => {
host_functions.sort_by(|a, b| a.function_name.cmp(&b.function_name))
}
None => {}
}
}
#[cfg_attr(feature = "tracing", instrument(skip_all, parent = Span::current(), level= "Trace"))]
pub fn find_by_function_name(&self, function_name: &str) -> Option<HostFunctionDefinition> {
match &self.host_functions {
Some(host_functions) => {
for host_function in host_functions {
if host_function.function_name == function_name {
return Some(host_function.clone());
}
}
None
}
None => None,
}
}
}
impl TryFrom<&[u8]> for HostFunctionDetails {
type Error = Error;
#[cfg_attr(feature = "tracing", instrument(err(Debug), skip_all, parent = Span::current(), level= "Trace"))]
fn try_from(value: &[u8]) -> Result<Self> {
let host_function_details_fb = size_prefixed_root::<FbHostFunctionDetails>(value)
.map_err(|e| anyhow::anyhow!("Error while reading HostFunctionDetails: {:?}", e))?;
let host_function_definitions = match host_function_details_fb.functions() {
Some(hfd) => {
let len = hfd.len();
let mut vec_hfd: Vec<HostFunctionDefinition> = Vec::with_capacity(len);
for i in 0..len {
let fb_host_function_definition = hfd.get(i);
let hfdef = HostFunctionDefinition::try_from(&fb_host_function_definition)?;
vec_hfd.push(hfdef);
}
Some(vec_hfd)
}
None => None,
};
Ok(Self {
host_functions: host_function_definitions,
})
}
}
impl TryFrom<&HostFunctionDetails> for Vec<u8> {
type Error = Error;
#[cfg_attr(feature = "tracing", instrument(err(Debug), skip_all, parent = Span::current(), level= "Trace"))]
fn try_from(value: &HostFunctionDetails) -> Result<Vec<u8>> {
let mut builder = flatbuffers::FlatBufferBuilder::new();
let vec_host_function_definitions = match &value.host_functions {
Some(vec_hfd) => {
let num_items = vec_hfd.len();
let mut host_function_definitions: Vec<WIPOffset<FbHostFunctionDefinition>> =
Vec::with_capacity(num_items);
for hfd in vec_hfd {
let host_function_definition = hfd.convert_to_flatbuffer_def(&mut builder)?;
host_function_definitions.push(host_function_definition);
}
Some(host_function_definitions)
}
None => None,
};
let fb_host_function_definitions =
vec_host_function_definitions.map(|v| builder.create_vector(&v));
let host_function_details = FbHostFunctionDetails::create(
&mut builder,
&FbHostFunctionDetailsArgs {
functions: fb_host_function_definitions,
},
);
builder.finish_size_prefixed(host_function_details, None);
let res = builder.finished_data().to_vec();
Ok(res)
}
}