xref: /aosp_15_r20/tools/netsim/rust/cli/src/ffi.rs (revision cf78ab8cffb8fc9207af348f23af247fb04370a6)
1*cf78ab8cSAndroid Build Coastguard Worker //! Frontend-client library for rust.
2*cf78ab8cSAndroid Build Coastguard Worker ///
3*cf78ab8cSAndroid Build Coastguard Worker /// Rust to C++ Grpc frontend.proto for Windows, linux and mac.
4*cf78ab8cSAndroid Build Coastguard Worker ///
5*cf78ab8cSAndroid Build Coastguard Worker /// This can be replaced with grpcio native implementation when the
6*cf78ab8cSAndroid Build Coastguard Worker /// Windows build works.
7*cf78ab8cSAndroid Build Coastguard Worker 
8*cf78ab8cSAndroid Build Coastguard Worker /// Wrapper struct for application defined ClientResponseReader
9*cf78ab8cSAndroid Build Coastguard Worker pub struct ClientResponseReader {
10*cf78ab8cSAndroid Build Coastguard Worker     /// Delegated handler for reading responses
11*cf78ab8cSAndroid Build Coastguard Worker     pub handler: Box<dyn ClientResponseReadable>,
12*cf78ab8cSAndroid Build Coastguard Worker }
13*cf78ab8cSAndroid Build Coastguard Worker 
14*cf78ab8cSAndroid Build Coastguard Worker /// Delegating functions to handler
15*cf78ab8cSAndroid Build Coastguard Worker impl ClientResponseReader {
handle_chunk(&self, chunk: &[u8])16*cf78ab8cSAndroid Build Coastguard Worker     fn handle_chunk(&self, chunk: &[u8]) {
17*cf78ab8cSAndroid Build Coastguard Worker         self.handler.handle_chunk(chunk);
18*cf78ab8cSAndroid Build Coastguard Worker     }
handle_error(&self, error_code: u32, error_message: &str)19*cf78ab8cSAndroid Build Coastguard Worker     fn handle_error(&self, error_code: u32, error_message: &str) {
20*cf78ab8cSAndroid Build Coastguard Worker         self.handler.handle_error(error_code, error_message);
21*cf78ab8cSAndroid Build Coastguard Worker     }
22*cf78ab8cSAndroid Build Coastguard Worker }
23*cf78ab8cSAndroid Build Coastguard Worker 
24*cf78ab8cSAndroid Build Coastguard Worker /// Trait for ClientResponseReader handler functions
25*cf78ab8cSAndroid Build Coastguard Worker pub trait ClientResponseReadable {
26*cf78ab8cSAndroid Build Coastguard Worker     /// Process each chunk of streaming response
handle_chunk(&self, chunk: &[u8])27*cf78ab8cSAndroid Build Coastguard Worker     fn handle_chunk(&self, chunk: &[u8]);
28*cf78ab8cSAndroid Build Coastguard Worker     /// Process errors in response
handle_error(&self, error_code: u32, error_message: &str)29*cf78ab8cSAndroid Build Coastguard Worker     fn handle_error(&self, error_code: u32, error_message: &str);
30*cf78ab8cSAndroid Build Coastguard Worker }
31*cf78ab8cSAndroid Build Coastguard Worker 
32*cf78ab8cSAndroid Build Coastguard Worker #[cxx::bridge(namespace = "netsim::frontend")]
33*cf78ab8cSAndroid Build Coastguard Worker #[allow(clippy::needless_maybe_sized)]
34*cf78ab8cSAndroid Build Coastguard Worker #[allow(missing_docs)]
35*cf78ab8cSAndroid Build Coastguard Worker #[allow(unsafe_op_in_unsafe_fn)]
36*cf78ab8cSAndroid Build Coastguard Worker pub mod frontend_client_ffi {
37*cf78ab8cSAndroid Build Coastguard Worker     // Shared enum GrpcMethod
38*cf78ab8cSAndroid Build Coastguard Worker     #[derive(Debug, PartialEq, Eq)]
39*cf78ab8cSAndroid Build Coastguard Worker     pub enum GrpcMethod {
40*cf78ab8cSAndroid Build Coastguard Worker         GetVersion,
41*cf78ab8cSAndroid Build Coastguard Worker         CreateDevice,
42*cf78ab8cSAndroid Build Coastguard Worker         DeleteChip,
43*cf78ab8cSAndroid Build Coastguard Worker         PatchDevice,
44*cf78ab8cSAndroid Build Coastguard Worker         ListDevice,
45*cf78ab8cSAndroid Build Coastguard Worker         Reset,
46*cf78ab8cSAndroid Build Coastguard Worker         ListCapture,
47*cf78ab8cSAndroid Build Coastguard Worker         PatchCapture,
48*cf78ab8cSAndroid Build Coastguard Worker         GetCapture,
49*cf78ab8cSAndroid Build Coastguard Worker     }
50*cf78ab8cSAndroid Build Coastguard Worker 
51*cf78ab8cSAndroid Build Coastguard Worker     extern "Rust" {
52*cf78ab8cSAndroid Build Coastguard Worker         type ClientResponseReader;
handle_chunk(&self, chunk: &[u8])53*cf78ab8cSAndroid Build Coastguard Worker         fn handle_chunk(&self, chunk: &[u8]);
handle_error(&self, error_code: u32, error_message: &str)54*cf78ab8cSAndroid Build Coastguard Worker         fn handle_error(&self, error_code: u32, error_message: &str);
55*cf78ab8cSAndroid Build Coastguard Worker     }
56*cf78ab8cSAndroid Build Coastguard Worker 
57*cf78ab8cSAndroid Build Coastguard Worker     // C++ types and signatures exposed to Rust.
58*cf78ab8cSAndroid Build Coastguard Worker     unsafe extern "C++" {
59*cf78ab8cSAndroid Build Coastguard Worker         include!("frontend/frontend_client.h");
60*cf78ab8cSAndroid Build Coastguard Worker 
61*cf78ab8cSAndroid Build Coastguard Worker         type FrontendClient;
62*cf78ab8cSAndroid Build Coastguard Worker         type ClientResult;
63*cf78ab8cSAndroid Build Coastguard Worker 
64*cf78ab8cSAndroid Build Coastguard Worker         #[allow(dead_code)]
65*cf78ab8cSAndroid Build Coastguard Worker         #[rust_name = "new_frontend_client"]
NewFrontendClient(server: &CxxString) -> UniquePtr<FrontendClient>66*cf78ab8cSAndroid Build Coastguard Worker         pub fn NewFrontendClient(server: &CxxString) -> UniquePtr<FrontendClient>;
67*cf78ab8cSAndroid Build Coastguard Worker 
68*cf78ab8cSAndroid Build Coastguard Worker         #[allow(dead_code)]
69*cf78ab8cSAndroid Build Coastguard Worker         #[rust_name = "get_capture"]
GetCapture( self: &FrontendClient, request: &Vec<u8>, client_reader: &ClientResponseReader, ) -> UniquePtr<ClientResult>70*cf78ab8cSAndroid Build Coastguard Worker         pub fn GetCapture(
71*cf78ab8cSAndroid Build Coastguard Worker             self: &FrontendClient,
72*cf78ab8cSAndroid Build Coastguard Worker             request: &Vec<u8>,
73*cf78ab8cSAndroid Build Coastguard Worker             client_reader: &ClientResponseReader,
74*cf78ab8cSAndroid Build Coastguard Worker         ) -> UniquePtr<ClientResult>;
75*cf78ab8cSAndroid Build Coastguard Worker 
76*cf78ab8cSAndroid Build Coastguard Worker         #[allow(dead_code)]
77*cf78ab8cSAndroid Build Coastguard Worker         #[rust_name = "send_grpc"]
SendGrpc( self: &FrontendClient, grpc_method: &GrpcMethod, request: &Vec<u8>, ) -> UniquePtr<ClientResult>78*cf78ab8cSAndroid Build Coastguard Worker         pub fn SendGrpc(
79*cf78ab8cSAndroid Build Coastguard Worker             self: &FrontendClient,
80*cf78ab8cSAndroid Build Coastguard Worker             grpc_method: &GrpcMethod,
81*cf78ab8cSAndroid Build Coastguard Worker             request: &Vec<u8>,
82*cf78ab8cSAndroid Build Coastguard Worker         ) -> UniquePtr<ClientResult>;
83*cf78ab8cSAndroid Build Coastguard Worker 
84*cf78ab8cSAndroid Build Coastguard Worker         #[allow(dead_code)]
85*cf78ab8cSAndroid Build Coastguard Worker         #[rust_name = "is_ok"]
IsOk(self: &ClientResult) -> bool86*cf78ab8cSAndroid Build Coastguard Worker         pub fn IsOk(self: &ClientResult) -> bool;
87*cf78ab8cSAndroid Build Coastguard Worker 
88*cf78ab8cSAndroid Build Coastguard Worker         #[allow(dead_code)]
89*cf78ab8cSAndroid Build Coastguard Worker         #[rust_name = "err"]
Err(self: &ClientResult) -> String90*cf78ab8cSAndroid Build Coastguard Worker         pub fn Err(self: &ClientResult) -> String;
91*cf78ab8cSAndroid Build Coastguard Worker 
92*cf78ab8cSAndroid Build Coastguard Worker         #[allow(dead_code)]
93*cf78ab8cSAndroid Build Coastguard Worker         #[rust_name = "byte_vec"]
ByteVec(self: &ClientResult) -> &CxxVector<u8>94*cf78ab8cSAndroid Build Coastguard Worker         pub fn ByteVec(self: &ClientResult) -> &CxxVector<u8>;
95*cf78ab8cSAndroid Build Coastguard Worker 
96*cf78ab8cSAndroid Build Coastguard Worker     }
97*cf78ab8cSAndroid Build Coastguard Worker }
98