2020-07-07 10:38:27 +03:00
|
|
|
# Basics
|
|
|
|
|
|
|
|
## Formatting Rust code
|
|
|
|
|
|
|
|
To format all the Rust code within a directory `$DIR`, run:
|
|
|
|
```
|
|
|
|
./mach lint -l rustfmt --fix $DIR
|
|
|
|
```
|
|
|
|
|
|
|
|
## Using Cargo
|
|
|
|
|
|
|
|
Many Cargo commands can be run on individual crates. Change into the directory
|
|
|
|
containing the crate's `Cargo.toml` file, and then run the command with
|
|
|
|
`MOZ_TOPOBJDIR` set appropriately. For example, to generate and view rustdocs
|
|
|
|
for the `xpcom` crate, run these commands:
|
|
|
|
|
|
|
|
```
|
|
|
|
cd xpcom/rust/xpcom
|
|
|
|
MOZ_TOPOBJDIR=$OBJDIR cargo doc
|
|
|
|
cd -
|
2022-12-30 18:23:21 +03:00
|
|
|
firefox target/doc/xpcom/index.html
|
2020-07-07 10:38:27 +03:00
|
|
|
```
|
|
|
|
where `$OBJDIR` is the path to the object directory.
|
|
|
|
|
|
|
|
## Using static prefs
|
|
|
|
|
|
|
|
Static boolean/integer prefs can be easily accessed from Rust code. Add a
|
|
|
|
`rust: true` field to the pref definition in
|
|
|
|
[modules/libpref/init/StaticPrefList.yaml](https://searchfox.org/mozilla-central/source/modules/libpref/init/StaticPrefList.yaml),
|
|
|
|
like this:
|
|
|
|
```yaml
|
|
|
|
- name: my.lucky.pref
|
|
|
|
type: RelaxedAtomicBool
|
|
|
|
value: true
|
|
|
|
mirror: always
|
|
|
|
rust: true
|
|
|
|
```
|
|
|
|
The pref can then be accessed via the `pref!` macro, like this:
|
|
|
|
```
|
|
|
|
let my_lucky_pref = static_prefs::pref!("my.lucky.pref");
|
|
|
|
```
|
|
|
|
|
|
|
|
## Helper crates
|
|
|
|
|
|
|
|
The following in-tree helper crates provide idiomatic support for some common patterns.
|
|
|
|
- [nserror](https://searchfox.org/mozilla-central/source/xpcom/rust/nserror/src/lib.rs)
|
|
|
|
reflects `nsresult` codes into Rust.
|
|
|
|
- [nsstring](https://searchfox.org/mozilla-central/source/xpcom/rust/nsstring/src/lib.rs)
|
|
|
|
exposes bindings for XPCOM string types. You can use the same `ns{A,C}String`
|
|
|
|
types as C++ for owned strings and pass them back and forth over the
|
|
|
|
boundary. There is also `ns{A,C}Str` for dependent or borrowed strings.
|
2023-10-18 02:18:48 +03:00
|
|
|
- [thin-vec](https://docs.rs/thin-vec/latest/thin_vec/) provides a
|
|
|
|
Rust `Vec`-like type that is layout-compatible with Gecko's `nsTArray`.
|
2020-07-07 10:38:27 +03:00
|
|
|
- [xpcom](https://searchfox.org/mozilla-central/source/xpcom/rust/xpcom/src)
|
|
|
|
provides multiple building blocks for a component's implementation.
|
|
|
|
- The `RefPtr` type is for managing reference-counted pointers.
|
2022-09-13 16:47:13 +03:00
|
|
|
- XPCOM component getters are generated by
|
|
|
|
[xpcom/components/gen_static_components.py](https://searchfox.org/mozilla-central/source/xpcom/components/gen_static_components.py),
|
2020-07-07 10:38:27 +03:00
|
|
|
and can be called like this:
|
|
|
|
```
|
2022-09-13 16:47:13 +03:00
|
|
|
use xpcom::{interfaces::nsIPrefService, RefPtr};
|
|
|
|
let pref_service: RefPtr<nsIPrefService> = xpcom::components::Preferences::service()?;
|
2020-07-07 10:38:27 +03:00
|
|
|
```
|
|
|
|
- There is also a `get_service` function that works like `do_GetService` in
|
|
|
|
C++, as an alternative.
|
|
|
|
- A set of `derive` macros help with declaring interface implementations. The
|
|
|
|
[docs](https://searchfox.org/mozilla-central/source/xpcom/rust/xpcom/xpcom_macros/src/lib.rs)
|
|
|
|
have details and examples.
|
|
|
|
- [moz_task](https://searchfox.org/mozilla-central/source/xpcom/rust/moz_task/src/lib.rs)
|
|
|
|
wraps XPCOM's threading functions in order to make it easy and safe to write
|
|
|
|
threaded code. It has helpers for getting and creating threads, dispatching
|
|
|
|
async runnables, and thread-safe handles.
|
|
|
|
- [storage](https://searchfox.org/mozilla-central/source/storage/rust/src/lib.rs)
|
|
|
|
is an interface to mozStorage, our wrapper for SQLite. It can wrap an
|
|
|
|
existing storage connection, and prepare and execute statements. This crate
|
|
|
|
wraps the synchronous connection API, and lets you execute statements
|
|
|
|
asynchronously via `moz_task`.
|
|
|
|
- [storage_variant](https://searchfox.org/mozilla-central/source/storage/variant/src/lib.rs)
|
|
|
|
is for working with variants. It also provides a `HashPropertyBag` type
|
|
|
|
that's useful for passing hash maps over XPCOM to JS.
|
|
|
|
|
|
|
|
Unfortunately, rustdocs are [not yet generated and
|
|
|
|
hosted](https://bugzilla.mozilla.org/show_bug.cgi?id=1428139) for crates within
|
|
|
|
mozilla-central. Therefore, the crate links shown above link to files
|
|
|
|
containing the relevant rustdocs source where possible. However, you can
|
|
|
|
generate docs locally using the `cargo doc` command described above.
|