# Rust

## Build

There are four GN target templates which should be used for Rust projects:

- [`rustc_library`][target-library-rustc] defines a library and optionally a
  unit test target. The library can be depended on by other targets.
- [`rustc_binary`][target-binary-rustc] defines an executable and optionally a
  unit test target.
- [`rustc_test`][target-test-rustc] defines a test-only target.
- [`rustc_macro`][target-macro-rustc] defines a
  [procedural macro][rust-proc-macros] target.

The [examples/rust][rust-examples] directory has some examples of Rust
packages that use these targets, as do the [Rust FIDL examples][fidl-tutorial].

Note: The example [Rust BUILD.gn file](/examples/rust/BUILD.gn)
contains the line `group("rust")`. In this instance, `rust` refers to the directory
the `.gn` file is in, not the language.

### Building with a custom toolchain

If you want to test out Fuchsia with your own custom-built versions of rustc or
cargo, you can set the `rustc_prefix` argument to `fx set`, like this:

```
fx set core.x64 --release --args "rustc_prefix=\"/path/to/bin/dir\""
```

## Cargo.toml

Fuchsia Rust targets are not built with cargo. That said, you can
[generate Cargo.toml files](cargo.md) for use with external tooling. This
functionality is not guaranteed to work.

## Autogenerated documentation

You can generate and browse HTML documentation for your target and its
dependencies by running:

```sh
fx rustdoc path/from/fuchsia/root/to/target:label --open
```

## Tests

You can run unit tests on connected devices using `fx`, with the `fx test
{package name}` command.  See [Testing Rust code](testing.md) for information
on adding and running tests.

## Procedural macros

Procedural macro targets are executed on the host at compile time. Therefore,
they cannot depend on other crates which are only available on device, e.g.
zircon.

Negative tests, e.g. asserting that a macro fails to compile with a specific
error, are currently not supported.

## Warnings and errors

By default our build configuration makes all Rust warnings into errors. This requirement can be
onerous during development, and on your local machine you may wish to see warnings as warnings and
let CQ enforce the hard boundary.

The `rust_cap_lints` GN arg allows you to control this behavior in your development environment.
Setting `rust_cap_lints = "warn"` in `fx args` or `fx set` will allow you to develop locally without
being blocked by warnings.

## Style

We don't currently have a style guide for Rust, but you should run `fx rustfmt`
or `fx format-code` before submitting. We mostly use the rustfmt defaults, but
have a couple [custom settings][rustfmt-toml].

## Rust Idiomatic Usage Review

If you're new to Rust, and would like someone to review your changes to
validate that your usage of Rust is idiomatic, contact one of the following
(or add them as a reviewer to your change.)

- adamperry@google.com
- belgum@google.com
- dnordstrom@google.com
- jamuraa@google.com
- nickpollard@google.com
- tmandry@google.com

(To volunteer for this, please add yourself to the list above and upload the
change with one of the above as the reviewer).

## Communication channels

Public discussion happens on the [rust-fuchsia@fuchsia.com] mailing list.

{% dynamic if user.is_googler %}

**[Googlers only]** For Googler-only channels, see
[go/fuchsia-rust-googlers].

{% dynamic endif %}

## Existing Fuchsia Rust libraries

- [List of crates](crates.md)
- [Autogenerated documentation for crates](https://fuchsia-docs.firebaseapp.com)

## Going further

- [Editor setup](editors.md)
- [Measuring binary bloat](bloat.md)
- [Managing third-party dependencies](third_party.md)
- [Unsafe code](unsafe.md)
- [Unstable features](unstable.md)
- [Rust FIDL server/client tutorial][fidl-tutorial]
- [Logging](logging.md)
- [Add logging to hello world](add-logging.md)


[target-library-rustc]: /build/rust/rustc_library.gni "Rust library"
[target-binary-rustc]: /build/rust/rustc_binary.gni "Rust binary"
[target-test-rustc]: /build/rust/rustc_test.gni "Rust test"
[target-macro-rustc]: /build/rust/rustc_macro.gni "Rust proc macro"
[rust-examples]: /examples/rust/
[fargo]: https://fuchsia.googlesource.com/fargo
[rustfmt-install]: https://github.com/rust-lang-nursery/rustfmt#quick-start
[rustfmt-toml]: /rustfmt.toml
[fidl-tutorial]: /docs/development/languages/fidl/tutorials/rust
[rust-fuchsia@fuchsia.com]: https://groups.google.com/a/fuchsia.com/forum/#!forum/rust-fuchsia
[go/fuchsia-rust-googlers]: https://goto.google.com/fuchsia-rust-googlers
[rust-proc-macros]: https://doc.rust-lang.org/reference/procedural-macros.html
