This document is a subset of the Mojo documentation. If you're interested in using the Mojo bindings to write Rust code, you probably want to read the documentation for the Rust Bindings API.
This folder contains the source code for using Mojo from Rust code. It is divided into three layers:
Note that other languages (particularly C++) have only layers (2) and (3), building on the C API without wrappers.
The files in this directory are documented using doc comments, which are (meant to be) rendered via rustdoc.
The purpose of the C API wrappers is to provide the ability to call the C API from Rust code without having to deal with the normal problems with FFI calls: unsafety, raw pointers, needing to precisely match types, etc. This code lives in the mojo_c_api directory.
To that end, this layer provide safe, idiomatic Rust equivalents for the Mojo C API functions. Not all functions are covered yet (feel free to add more if you need them!).
These wrappers are suitable for general use; if you find you need to work with Mojo from Rust at a low level, you should use this crate instead of rolling your own bindings. However, most uses will benefit from the higher-level abstractions in the System and Bindings APIs.
Notable improvements over the raw C API include:
&str).MojoHandle type has been replaced with the UntypedHandle type which provides lifetime management, analogous to the ScopedHandle types in C++.MojoResult type has been replaced with a native Rust Result type.*Options structs have been replaced with bitflags.The Rust System API is meant to provide an intermediate layer between the low-level C API and the user-facing Bindings API. Its code lives in the system directory.
This crate consolidates the low-level functions from the C API into a more idiomatic design. For example, rather than several independent functions that are meant to operate on message pipe handles, it defines a strongly-typed MessagePipeEndpoint with appropriate traits and inherent impls that provide all the message-pipe-related functionality.
Like the C Wrappers, this crate is suitable for standalone use on lower-level projects that want to interact with Mojo via Rust. However, for most use-cases, the higher-level constructs in the Bindings API will be more convenient.
The Rust Bindings API provides the user-visible API for sending and receiving messages via Mojo. In contrast to the lower two layers, which aim to provide APIs for the basic Mojo primitives, the Bindings API provides high-level APIs that build atop them. For example, the MessagePipeWatcher type uses a trap to execute a user-provided function whenever a message comes in on the watched pipe.
Many of the abstractions are specific to Mojom, the Interface Definition Language (IDL) used to specify message formats. For example, the Remote and Receiver types provide the ability to send and receive messages that were defined in .mojom files.
The types in this crate are designed to be used by chromium developers doing day-to-day Rust development. If your goal is to send message to/from Rust using Mojo, you should use the Bindings API.