ng_gateway_driver/
macros.rs#[macro_export]
macro_rules! driver {
($driver:expr) => {
#[no_mangle]
pub extern "C" fn driver() -> Arc<dyn NGDriver> {
use ng_gateway_driver::NGDriver;
use std::sync::Arc;
let _driver: Arc<dyn NGDriver> = Arc::new($driver);
_driver
}
};
}
#[macro_export]
macro_rules! driver_metadata {
($metadata:expr) => {
use std::sync::Mutex;
static METADATA_BUFFER: Mutex<Option<Vec<u8>>> = Mutex::new(None);
#[no_mangle]
pub extern "C" fn metadata() -> *const u8 {
use prost::Message;
let _check_metadata_type: node_grove_common_api::ng_proto::DriverMetadata = $metadata;
let metadata = $metadata;
let mut buf = Vec::new();
metadata
.encode(&mut buf)
.expect("Failed to encode Protobuf");
let ptr = buf.as_ptr();
*METADATA_BUFFER.lock().unwrap() = Some(buf);
ptr
}
#[no_mangle]
pub extern "C" fn metadata_length() -> usize {
METADATA_BUFFER
.lock()
.unwrap()
.as_ref()
.map_or(0, |buf| buf.len())
}
#[no_mangle]
pub extern "C" fn free_metadata() {
*METADATA_BUFFER.lock().unwrap() = None;
}
};
}