# Rust

## Build

There are four GN target templates that 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.

See also: [Build Fuchsia with a custom Rust toolchain](../../build/rust_toolchain.md)

## 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

Once you have a Cargo.toml for your target 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 that 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 `deny_warnings` GN arg allows you to control this behavior in your development environment.
Setting `deny_warnings = false` in `fx args` or adding `--args=deny_warnings=false` to
your `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 or would like someone to review your changes to
validate that your usage of Rust is idiomatic, add "Fuchsia Rust Reviewers"
as a reviewer to your CL in Gerrit and a reviewer will be assigned.

Email tq-rust-reviewers@google.com with any issues.

{% dynamic if user.is_googler %}

**[Googlers only]** You can view the
[list of Rust Reviewers](https://goto.corp.google.com/tq-rust-reviewers-list).
New reviewers can be nominated by an existing reviewer using
[this form](https://goto.corp.google.com/tq-rust-reviewers-nominate).

{% dynamic endif %}

## Communication channels

Public discussion happens on the [rust-users@fuchsia.dev] 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/rust/)

## Going further

- [Editor setup](editors.md)
- [Measuring binary bloat](bloat.md)
- [Managing external dependencies](external_crates.md)
- [Unsafe code](unsafe.md)
- [Unstable features](unstable.md)
- [Rust FIDL server/client tutorial][fidl-tutorial]
- [Logging](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-users@fuchsia.dev]: https://groups.google.com/a/fuchsia.dev/g/rust-users
[go/fuchsia-rust-googlers]: https://goto.google.com/fuchsia-rust-googlers
[rust-proc-macros]: https://doc.rust-lang.org/reference/procedural-macros.html
