blob: 68c800367cb99be5da7eb09d0bf23a789485a71a [file] [log] [blame]
//Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
chromium::import! {
pub "//mojo/public/rust:mojo_c_system_bindings" as raw_ffi;
}
pub mod types {
//! Defines some C-compatible types for the ffi layer of
//! the bindings.
use super::raw_ffi;
pub use raw_ffi::MojoAddTriggerFlags;
pub use raw_ffi::MojoAppendMessageDataFlags;
pub use raw_ffi::MojoArmTrapFlags;
pub use raw_ffi::MojoBeginReadDataFlags;
pub use raw_ffi::MojoBeginWriteDataFlags;
pub use raw_ffi::MojoCreateDataPipeFlags;
pub use raw_ffi::MojoCreateMessageFlags;
pub use raw_ffi::MojoCreateMessagePipeFlags;
pub use raw_ffi::MojoCreateSharedBufferFlags;
pub use raw_ffi::MojoCreateTrapFlags;
pub use raw_ffi::MojoDuplicateBufferHandleFlags;
pub use raw_ffi::MojoEndReadDataFlags;
pub use raw_ffi::MojoEndWriteDataFlags;
pub use raw_ffi::MojoGetBufferInfoFlags;
pub use raw_ffi::MojoGetMessageDataFlags;
pub use raw_ffi::MojoHandle;
pub use raw_ffi::MojoHandleSignals;
pub use raw_ffi::MojoHandleSignalsState;
pub use raw_ffi::MojoMapBufferFlags;
pub use raw_ffi::MojoMessageHandle;
pub use raw_ffi::MojoReadDataFlags;
pub use raw_ffi::MojoReadMessageFlags;
pub use raw_ffi::MojoRemoveTriggerFlags;
pub use raw_ffi::MojoTimeTicks;
pub use raw_ffi::MojoTrapEventFlags;
pub use raw_ffi::MojoTrapEventHandler;
pub use raw_ffi::MojoTriggerCondition;
pub use raw_ffi::MojoWriteDataFlags;
pub use raw_ffi::MojoWriteMessageFlags;
pub type MojoResultCode = raw_ffi::MojoResult;
}
pub use raw_ffi::MojoAppendMessageData;
pub use raw_ffi::MojoClose;
pub use raw_ffi::MojoCreateMessage;
pub use raw_ffi::MojoCreateMessagePipe;
pub use raw_ffi::MojoDestroyMessage;
pub use raw_ffi::MojoGetMessageData;
pub use raw_ffi::MojoGetTimeTicksNow;
pub use raw_ffi::MojoHandleSignalsState as SignalsState;
pub use raw_ffi::MojoQueryHandleSignalsState;
pub use raw_ffi::MojoReadMessage;
pub use raw_ffi::MojoWriteMessage;
pub use types::MojoResultCode;
// Most FFI functions take an options struct as input which we get from bindgen.
// Each one contains a `struct_size` member for versioning. We want to make a
// 'newtype' wrapper for each that manages the struct_size as well as adds a
// `new()` function for construction.
//
// To reduce boilerplate we use a macro.
//
// The generated structs contain methods to get raw pointers for passing to FFI
// functions. Note the FFI functions don't require the structs to live beyond
// each call.
macro_rules! declare_mojo_options {
($struct_name:ident, $( $field_name:ident : $field_type:ty ),*) => {
#[repr(transparent)]
pub struct $struct_name(raw_ffi::$struct_name);
impl $struct_name {
pub fn new($($field_name : $field_type),*) -> $struct_name {
$struct_name(raw_ffi::$struct_name {
struct_size: ::std::mem::size_of::<$struct_name>() as u32,
$($field_name),*
})
}
// Get an immutable pointer to the wrapped FFI struct to pass to
// C functions.
pub fn as_ptr(&self) -> *const raw_ffi::$struct_name {
// $struct_name is a repr(transparent) wrapper around raw_ffi::$struct_name
self as *const _ as *const _
}
// Get a mutable pointer to the wrapped FFI struct to pass to
// C functions.
pub fn as_mut_ptr(&mut self) -> *mut raw_ffi::$struct_name {
// $struct_name is a repr(transparent) wrapper around raw_ffi::$struct_name
self as *mut _ as *mut _
}
}
impl std::ops::Deref for $struct_name {
type Target = raw_ffi::$struct_name;
fn deref(&self) -> &Self::Target {
&self.0
}
}
impl std::ops::DerefMut for $struct_name {
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.0
}
}
}
}
declare_mojo_options!(MojoAppendMessageDataOptions, flags: types::MojoAppendMessageDataFlags);
declare_mojo_options!(MojoCreateMessagePipeOptions, flags: types::MojoCreateMessagePipeFlags);
declare_mojo_options!(MojoWriteMessageOptions, flags: types::MojoWriteMessageFlags);