# 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. You can
add the argument to [`local/args.gn`][local-args] in your checkout so that it will be applied
to all builds without needing to type it in your terminal each time.

[local-args]: /docs/development/build/fx.md#defining-persistent-local-build-arguments

## 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](/docs/reference/rust/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
