hyperlight_common/flatbuffer_wrappers/
util.rs

1/*
2Copyright 2024 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 alloc::vec::Vec;
18
19use flatbuffers::FlatBufferBuilder;
20
21use crate::flatbuffers::hyperlight::generated::{
22    hlbool as Fbhlbool, hlboolArgs as FbhlboolArgs, hldouble as Fbhldouble,
23    hldoubleArgs as FbhldoubleArgs, hlfloat as Fbhlfloat, hlfloatArgs as FbhlfloatArgs,
24    hlint as Fbhlint, hlintArgs as FbhlintArgs, hllong as Fbhllong, hllongArgs as FbhllongArgs,
25    hlsizeprefixedbuffer as Fbhlsizeprefixedbuffer,
26    hlsizeprefixedbufferArgs as FbhlsizeprefixedbufferArgs, hlstring as Fbhlstring,
27    hlstringArgs as FbhlstringArgs, hluint as Fbhluint, hluintArgs as FbhluintArgs,
28    hlulong as Fbhlulong, hlulongArgs as FbhlulongArgs, hlvoid as Fbhlvoid,
29    hlvoidArgs as FbhlvoidArgs, FunctionCallResult as FbFunctionCallResult,
30    FunctionCallResultArgs as FbFunctionCallResultArgs, ReturnValue as FbReturnValue,
31};
32
33/// Flatbuffer-encodes the given value
34pub fn get_flatbuffer_result<T: FlatbufferSerializable>(val: T) -> Vec<u8> {
35    let mut builder = FlatBufferBuilder::new();
36    let res = &T::serialize(&val, &mut builder);
37    let result_offset = FbFunctionCallResult::create(&mut builder, res);
38
39    builder.finish_size_prefixed(result_offset, None);
40
41    builder.finished_data().to_vec()
42}
43
44pub trait FlatbufferSerializable {
45    fn serialize(&self, builder: &mut FlatBufferBuilder) -> FbFunctionCallResultArgs;
46}
47
48/// Implementations for basic types below
49
50impl FlatbufferSerializable for () {
51    fn serialize(&self, builder: &mut FlatBufferBuilder) -> FbFunctionCallResultArgs {
52        FbFunctionCallResultArgs {
53            return_value: Some(Fbhlvoid::create(builder, &FbhlvoidArgs {}).as_union_value()),
54            return_value_type: FbReturnValue::hlvoid,
55        }
56    }
57}
58
59impl FlatbufferSerializable for &str {
60    fn serialize(&self, builder: &mut FlatBufferBuilder) -> FbFunctionCallResultArgs {
61        let string_offset = builder.create_string(self);
62        FbFunctionCallResultArgs {
63            return_value: Some(
64                Fbhlstring::create(
65                    builder,
66                    &FbhlstringArgs {
67                        value: Some(string_offset),
68                    },
69                )
70                .as_union_value(),
71            ),
72            return_value_type: FbReturnValue::hlstring,
73        }
74    }
75}
76
77impl FlatbufferSerializable for &[u8] {
78    fn serialize(&self, builder: &mut FlatBufferBuilder) -> FbFunctionCallResultArgs {
79        let vec_offset = builder.create_vector(self);
80        FbFunctionCallResultArgs {
81            return_value: Some(
82                Fbhlsizeprefixedbuffer::create(
83                    builder,
84                    &FbhlsizeprefixedbufferArgs {
85                        size: self.len() as i32,
86                        value: Some(vec_offset),
87                    },
88                )
89                .as_union_value(),
90            ),
91            return_value_type: FbReturnValue::hlsizeprefixedbuffer,
92        }
93    }
94}
95
96impl FlatbufferSerializable for f32 {
97    fn serialize(&self, builder: &mut FlatBufferBuilder) -> FbFunctionCallResultArgs {
98        FbFunctionCallResultArgs {
99            return_value: Some(
100                Fbhlfloat::create(builder, &FbhlfloatArgs { value: *self }).as_union_value(),
101            ),
102            return_value_type: FbReturnValue::hlfloat,
103        }
104    }
105}
106
107impl FlatbufferSerializable for f64 {
108    fn serialize(&self, builder: &mut FlatBufferBuilder) -> FbFunctionCallResultArgs {
109        FbFunctionCallResultArgs {
110            return_value: Some(
111                Fbhldouble::create(builder, &FbhldoubleArgs { value: *self }).as_union_value(),
112            ),
113            return_value_type: FbReturnValue::hldouble,
114        }
115    }
116}
117
118impl FlatbufferSerializable for i32 {
119    fn serialize(&self, builder: &mut FlatBufferBuilder) -> FbFunctionCallResultArgs {
120        FbFunctionCallResultArgs {
121            return_value: Some(
122                Fbhlint::create(builder, &FbhlintArgs { value: *self }).as_union_value(),
123            ),
124            return_value_type: FbReturnValue::hlint,
125        }
126    }
127}
128
129impl FlatbufferSerializable for i64 {
130    fn serialize(&self, builder: &mut FlatBufferBuilder) -> FbFunctionCallResultArgs {
131        FbFunctionCallResultArgs {
132            return_value: Some(
133                Fbhllong::create(builder, &FbhllongArgs { value: *self }).as_union_value(),
134            ),
135            return_value_type: FbReturnValue::hllong,
136        }
137    }
138}
139
140impl FlatbufferSerializable for u32 {
141    fn serialize(&self, builder: &mut FlatBufferBuilder) -> FbFunctionCallResultArgs {
142        FbFunctionCallResultArgs {
143            return_value: Some(
144                Fbhluint::create(builder, &FbhluintArgs { value: *self }).as_union_value(),
145            ),
146            return_value_type: FbReturnValue::hluint,
147        }
148    }
149}
150
151impl FlatbufferSerializable for u64 {
152    fn serialize(&self, builder: &mut FlatBufferBuilder) -> FbFunctionCallResultArgs {
153        FbFunctionCallResultArgs {
154            return_value: Some(
155                Fbhlulong::create(builder, &FbhlulongArgs { value: *self }).as_union_value(),
156            ),
157            return_value_type: FbReturnValue::hlulong,
158        }
159    }
160}
161
162impl FlatbufferSerializable for bool {
163    fn serialize(&self, builder: &mut FlatBufferBuilder) -> FbFunctionCallResultArgs {
164        FbFunctionCallResultArgs {
165            return_value: Some(
166                Fbhlbool::create(builder, &FbhlboolArgs { value: *self }).as_union_value(),
167            ),
168            return_value_type: FbReturnValue::hlbool,
169        }
170    }
171}