@@ -18,7 +18,7 @@ use alloc::string::{String, ToString};
18
18
use alloc:: vec:: Vec ;
19
19
20
20
use anyhow:: { bail, Error , Result } ;
21
- use flatbuffers:: { size_prefixed_root, WIPOffset } ;
21
+ use flatbuffers:: { size_prefixed_root, FlatBufferBuilder , WIPOffset } ;
22
22
#[ cfg( feature = "tracing" ) ]
23
23
use tracing:: { instrument, Span } ;
24
24
@@ -41,7 +41,6 @@ pub enum FunctionCallType {
41
41
}
42
42
43
43
/// `Functioncall` represents a call to a function in the guest or host.
44
- #[ derive( Clone ) ]
45
44
pub struct FunctionCall {
46
45
/// The function name
47
46
pub function_name : String ,
@@ -72,91 +71,29 @@ impl FunctionCall {
72
71
pub fn function_call_type ( & self ) -> FunctionCallType {
73
72
self . function_call_type . clone ( )
74
73
}
75
- }
76
74
77
- #[ cfg_attr( feature = "tracing" , instrument( err( Debug ) , skip_all, parent = Span :: current( ) , level= "Trace" ) ) ]
78
- pub fn validate_guest_function_call_buffer ( function_call_buffer : & [ u8 ] ) -> Result < ( ) > {
79
- let guest_function_call_fb = size_prefixed_root :: < FbFunctionCall > ( function_call_buffer)
80
- . map_err ( |e| anyhow:: anyhow!( "Error reading function call buffer: {:?}" , e) ) ?;
81
- match guest_function_call_fb. function_call_type ( ) {
82
- FbFunctionCallType :: guest => Ok ( ( ) ) ,
83
- other => {
84
- bail ! ( "Invalid function call type: {:?}" , other) ;
85
- }
86
- }
87
- }
88
-
89
- #[ cfg_attr( feature = "tracing" , instrument( err( Debug ) , skip_all, parent = Span :: current( ) , level= "Trace" ) ) ]
90
- pub fn validate_host_function_call_buffer ( function_call_buffer : & [ u8 ] ) -> Result < ( ) > {
91
- let host_function_call_fb = size_prefixed_root :: < FbFunctionCall > ( function_call_buffer)
92
- . map_err ( |e| anyhow:: anyhow!( "Error reading function call buffer: {:?}" , e) ) ?;
93
- match host_function_call_fb. function_call_type ( ) {
94
- FbFunctionCallType :: host => Ok ( ( ) ) ,
95
- other => {
96
- bail ! ( "Invalid function call type: {:?}" , other) ;
97
- }
98
- }
99
- }
75
+ /// Encodes self into the given builder and returns the encoded data.
76
+ pub fn encode < ' a > ( & self , builder : & ' a mut FlatBufferBuilder ) -> & ' a [ u8 ] {
77
+ let function_name = builder. create_string ( & self . function_name ) ;
100
78
101
- impl TryFrom < & [ u8 ] > for FunctionCall {
102
- type Error = Error ;
103
- #[ cfg_attr( feature = "tracing" , instrument( err( Debug ) , skip_all, parent = Span :: current( ) , level= "Trace" ) ) ]
104
- fn try_from ( value : & [ u8 ] ) -> Result < Self > {
105
- let function_call_fb = size_prefixed_root :: < FbFunctionCall > ( value)
106
- . map_err ( |e| anyhow:: anyhow!( "Error reading function call buffer: {:?}" , e) ) ?;
107
- let function_name = function_call_fb. function_name ( ) ;
108
- let function_call_type = match function_call_fb. function_call_type ( ) {
109
- FbFunctionCallType :: guest => FunctionCallType :: Guest ,
110
- FbFunctionCallType :: host => FunctionCallType :: Host ,
111
- other => {
112
- bail ! ( "Invalid function call type: {:?}" , other) ;
113
- }
114
- } ;
115
- let expected_return_type = function_call_fb. expected_return_type ( ) . try_into ( ) ?;
116
-
117
- let parameters = function_call_fb
118
- . parameters ( )
119
- . map ( |v| {
120
- v. iter ( )
121
- . map ( |p| p. try_into ( ) )
122
- . collect :: < Result < Vec < ParameterValue > > > ( )
123
- } )
124
- . transpose ( ) ?;
125
-
126
- Ok ( Self {
127
- function_name : function_name. to_string ( ) ,
128
- parameters,
129
- function_call_type,
130
- expected_return_type,
131
- } )
132
- }
133
- }
134
-
135
- impl TryFrom < FunctionCall > for Vec < u8 > {
136
- type Error = Error ;
137
- #[ cfg_attr( feature = "tracing" , instrument( err( Debug ) , skip_all, parent = Span :: current( ) , level= "Trace" ) ) ]
138
- fn try_from ( value : FunctionCall ) -> Result < Vec < u8 > > {
139
- let mut builder = flatbuffers:: FlatBufferBuilder :: new ( ) ;
140
- let function_name = builder. create_string ( & value. function_name ) ;
141
-
142
- let function_call_type = match value. function_call_type {
79
+ let function_call_type = match self . function_call_type {
143
80
FunctionCallType :: Guest => FbFunctionCallType :: guest,
144
81
FunctionCallType :: Host => FbFunctionCallType :: host,
145
82
} ;
146
83
147
- let expected_return_type = value . expected_return_type . into ( ) ;
84
+ let expected_return_type = self . expected_return_type . into ( ) ;
148
85
149
- let parameters = match & value . parameters {
86
+ let parameters = match & self . parameters {
150
87
Some ( p) => {
151
88
let num_items = p. len ( ) ;
152
89
let mut parameters: Vec < WIPOffset < Parameter > > = Vec :: with_capacity ( num_items) ;
153
90
154
91
for param in p {
155
92
match param {
156
93
ParameterValue :: Int ( i) => {
157
- let hlint = hlint:: create ( & mut builder, & hlintArgs { value : * i } ) ;
94
+ let hlint = hlint:: create ( builder, & hlintArgs { value : * i } ) ;
158
95
let parameter = Parameter :: create (
159
- & mut builder,
96
+ builder,
160
97
& ParameterArgs {
161
98
value_type : FbParameterValue :: hlint,
162
99
value : Some ( hlint. as_union_value ( ) ) ,
@@ -165,9 +102,9 @@ impl TryFrom<FunctionCall> for Vec<u8> {
165
102
parameters. push ( parameter) ;
166
103
}
167
104
ParameterValue :: UInt ( ui) => {
168
- let hluint = hluint:: create ( & mut builder, & hluintArgs { value : * ui } ) ;
105
+ let hluint = hluint:: create ( builder, & hluintArgs { value : * ui } ) ;
169
106
let parameter = Parameter :: create (
170
- & mut builder,
107
+ builder,
171
108
& ParameterArgs {
172
109
value_type : FbParameterValue :: hluint,
173
110
value : Some ( hluint. as_union_value ( ) ) ,
@@ -176,9 +113,9 @@ impl TryFrom<FunctionCall> for Vec<u8> {
176
113
parameters. push ( parameter) ;
177
114
}
178
115
ParameterValue :: Long ( l) => {
179
- let hllong = hllong:: create ( & mut builder, & hllongArgs { value : * l } ) ;
116
+ let hllong = hllong:: create ( builder, & hllongArgs { value : * l } ) ;
180
117
let parameter = Parameter :: create (
181
- & mut builder,
118
+ builder,
182
119
& ParameterArgs {
183
120
value_type : FbParameterValue :: hllong,
184
121
value : Some ( hllong. as_union_value ( ) ) ,
@@ -187,10 +124,9 @@ impl TryFrom<FunctionCall> for Vec<u8> {
187
124
parameters. push ( parameter) ;
188
125
}
189
126
ParameterValue :: ULong ( ul) => {
190
- let hlulong =
191
- hlulong:: create ( & mut builder, & hlulongArgs { value : * ul } ) ;
127
+ let hlulong = hlulong:: create ( builder, & hlulongArgs { value : * ul } ) ;
192
128
let parameter = Parameter :: create (
193
- & mut builder,
129
+ builder,
194
130
& ParameterArgs {
195
131
value_type : FbParameterValue :: hlulong,
196
132
value : Some ( hlulong. as_union_value ( ) ) ,
@@ -199,9 +135,9 @@ impl TryFrom<FunctionCall> for Vec<u8> {
199
135
parameters. push ( parameter) ;
200
136
}
201
137
ParameterValue :: Float ( f) => {
202
- let hlfloat = hlfloat:: create ( & mut builder, & hlfloatArgs { value : * f } ) ;
138
+ let hlfloat = hlfloat:: create ( builder, & hlfloatArgs { value : * f } ) ;
203
139
let parameter = Parameter :: create (
204
- & mut builder,
140
+ builder,
205
141
& ParameterArgs {
206
142
value_type : FbParameterValue :: hlfloat,
207
143
value : Some ( hlfloat. as_union_value ( ) ) ,
@@ -210,10 +146,9 @@ impl TryFrom<FunctionCall> for Vec<u8> {
210
146
parameters. push ( parameter) ;
211
147
}
212
148
ParameterValue :: Double ( d) => {
213
- let hldouble =
214
- hldouble:: create ( & mut builder, & hldoubleArgs { value : * d } ) ;
149
+ let hldouble = hldouble:: create ( builder, & hldoubleArgs { value : * d } ) ;
215
150
let parameter = Parameter :: create (
216
- & mut builder,
151
+ builder,
217
152
& ParameterArgs {
218
153
value_type : FbParameterValue :: hldouble,
219
154
value : Some ( hldouble. as_union_value ( ) ) ,
@@ -223,9 +158,9 @@ impl TryFrom<FunctionCall> for Vec<u8> {
223
158
}
224
159
ParameterValue :: Bool ( b) => {
225
160
let hlbool: WIPOffset < hlbool < ' _ > > =
226
- hlbool:: create ( & mut builder, & hlboolArgs { value : * b } ) ;
161
+ hlbool:: create ( builder, & hlboolArgs { value : * b } ) ;
227
162
let parameter = Parameter :: create (
228
- & mut builder,
163
+ builder,
229
164
& ParameterArgs {
230
165
value_type : FbParameterValue :: hlbool,
231
166
value : Some ( hlbool. as_union_value ( ) ) ,
@@ -236,10 +171,10 @@ impl TryFrom<FunctionCall> for Vec<u8> {
236
171
ParameterValue :: String ( s) => {
237
172
let hlstring = {
238
173
let val = builder. create_string ( s. as_str ( ) ) ;
239
- hlstring:: create ( & mut builder, & hlstringArgs { value : Some ( val) } )
174
+ hlstring:: create ( builder, & hlstringArgs { value : Some ( val) } )
240
175
} ;
241
176
let parameter = Parameter :: create (
242
- & mut builder,
177
+ builder,
243
178
& ParameterArgs {
244
179
value_type : FbParameterValue :: hlstring,
245
180
value : Some ( hlstring. as_union_value ( ) ) ,
@@ -251,13 +186,13 @@ impl TryFrom<FunctionCall> for Vec<u8> {
251
186
let vec_bytes = builder. create_vector ( v) ;
252
187
253
188
let hlvecbytes = hlvecbytes:: create (
254
- & mut builder,
189
+ builder,
255
190
& hlvecbytesArgs {
256
191
value : Some ( vec_bytes) ,
257
192
} ,
258
193
) ;
259
194
let parameter = Parameter :: create (
260
- & mut builder,
195
+ builder,
261
196
& ParameterArgs {
262
197
value_type : FbParameterValue :: hlvecbytes,
263
198
value : Some ( hlvecbytes. as_union_value ( ) ) ,
@@ -279,7 +214,7 @@ impl TryFrom<FunctionCall> for Vec<u8> {
279
214
} ;
280
215
281
216
let function_call = FbFunctionCall :: create (
282
- & mut builder,
217
+ builder,
283
218
& FbFunctionCallArgs {
284
219
function_name : Some ( function_name) ,
285
220
parameters,
@@ -288,9 +223,64 @@ impl TryFrom<FunctionCall> for Vec<u8> {
288
223
} ,
289
224
) ;
290
225
builder. finish_size_prefixed ( function_call, None ) ;
291
- let res = builder. finished_data ( ) . to_vec ( ) ;
226
+ builder. finished_data ( )
227
+ }
228
+ }
229
+
230
+ #[ cfg_attr( feature = "tracing" , instrument( err( Debug ) , skip_all, parent = Span :: current( ) , level= "Trace" ) ) ]
231
+ pub fn validate_guest_function_call_buffer ( function_call_buffer : & [ u8 ] ) -> Result < ( ) > {
232
+ let guest_function_call_fb = size_prefixed_root :: < FbFunctionCall > ( function_call_buffer)
233
+ . map_err ( |e| anyhow:: anyhow!( "Error reading function call buffer: {:?}" , e) ) ?;
234
+ match guest_function_call_fb. function_call_type ( ) {
235
+ FbFunctionCallType :: guest => Ok ( ( ) ) ,
236
+ other => {
237
+ bail ! ( "Invalid function call type: {:?}" , other) ;
238
+ }
239
+ }
240
+ }
241
+
242
+ #[ cfg_attr( feature = "tracing" , instrument( err( Debug ) , skip_all, parent = Span :: current( ) , level= "Trace" ) ) ]
243
+ pub fn validate_host_function_call_buffer ( function_call_buffer : & [ u8 ] ) -> Result < ( ) > {
244
+ let host_function_call_fb = size_prefixed_root :: < FbFunctionCall > ( function_call_buffer)
245
+ . map_err ( |e| anyhow:: anyhow!( "Error reading function call buffer: {:?}" , e) ) ?;
246
+ match host_function_call_fb. function_call_type ( ) {
247
+ FbFunctionCallType :: host => Ok ( ( ) ) ,
248
+ other => {
249
+ bail ! ( "Invalid function call type: {:?}" , other) ;
250
+ }
251
+ }
252
+ }
253
+
254
+ impl TryFrom < & [ u8 ] > for FunctionCall {
255
+ type Error = Error ;
256
+ #[ cfg_attr( feature = "tracing" , instrument( err( Debug ) , skip_all, parent = Span :: current( ) , level= "Trace" ) ) ]
257
+ fn try_from ( value : & [ u8 ] ) -> Result < Self > {
258
+ let function_call_fb = size_prefixed_root :: < FbFunctionCall > ( value)
259
+ . map_err ( |e| anyhow:: anyhow!( "Error reading function call buffer: {:?}" , e) ) ?;
260
+ let function_name = function_call_fb. function_name ( ) ;
261
+ let function_call_type = match function_call_fb. function_call_type ( ) {
262
+ FbFunctionCallType :: guest => FunctionCallType :: Guest ,
263
+ FbFunctionCallType :: host => FunctionCallType :: Host ,
264
+ other => {
265
+ bail ! ( "Invalid function call type: {:?}" , other) ;
266
+ }
267
+ } ;
268
+ let expected_return_type = function_call_fb. expected_return_type ( ) . try_into ( ) ?;
269
+ let parameters = function_call_fb
270
+ . parameters ( )
271
+ . map ( |v| {
272
+ v. iter ( )
273
+ . map ( |p| p. try_into ( ) )
274
+ . collect :: < Result < Vec < ParameterValue > > > ( )
275
+ } )
276
+ . transpose ( ) ?;
292
277
293
- Ok ( res)
278
+ Ok ( Self {
279
+ function_name : function_name. to_string ( ) ,
280
+ parameters,
281
+ function_call_type,
282
+ expected_return_type,
283
+ } )
294
284
}
295
285
}
296
286
@@ -303,7 +293,8 @@ mod tests {
303
293
304
294
#[ test]
305
295
fn read_from_flatbuffer ( ) -> Result < ( ) > {
306
- let test_data: Vec < u8 > = FunctionCall :: new (
296
+ let mut builder = FlatBufferBuilder :: new ( ) ;
297
+ let test_data = FunctionCall :: new (
307
298
"PrintTwelveArgs" . to_string ( ) ,
308
299
Some ( vec ! [
309
300
ParameterValue :: String ( "1" . to_string( ) ) ,
@@ -322,10 +313,9 @@ mod tests {
322
313
FunctionCallType :: Guest ,
323
314
ReturnType :: Int ,
324
315
)
325
- . try_into ( )
326
- . unwrap ( ) ;
316
+ . encode ( & mut builder) ;
327
317
328
- let function_call = FunctionCall :: try_from ( test_data. as_slice ( ) ) ?;
318
+ let function_call = FunctionCall :: try_from ( test_data) ?;
329
319
assert_eq ! ( function_call. function_name, "PrintTwelveArgs" ) ;
330
320
assert ! ( function_call. parameters. is_some( ) ) ;
331
321
let parameters = function_call. parameters . unwrap ( ) ;
0 commit comments