forked from mirrors/gecko-dev
		
	
		
			
				
	
	
		
			86 lines
		
	
	
	
		
			3.8 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			86 lines
		
	
	
	
		
			3.8 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
# 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 -
 | 
						|
firefox target/doc/xpcom/index.html
 | 
						|
```
 | 
						|
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.
 | 
						|
- [thin-vec](https://docs.rs/thin-vec/latest/thin_vec/) provides a
 | 
						|
  Rust `Vec`-like type that is layout-compatible with Gecko's `nsTArray`.
 | 
						|
- [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.
 | 
						|
  - XPCOM component getters are generated by
 | 
						|
    [xpcom/components/gen_static_components.py](https://searchfox.org/mozilla-central/source/xpcom/components/gen_static_components.py),
 | 
						|
    and can be called like this:
 | 
						|
    ```
 | 
						|
    use xpcom::{interfaces::nsIPrefService, RefPtr};
 | 
						|
    let pref_service: RefPtr<nsIPrefService> = xpcom::components::Preferences::service()?;
 | 
						|
    ```
 | 
						|
  - 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.
 |