| # Fuchsia Device Interface Rubric |
| |
| The Fuchsia device interfaces are expressed as FIDL protocols. These FIDL |
| definitions should conform to the [FIDL Style Rubric][fidl-style] and |
| [FIDL API Rubric][fidl-api]. |
| |
| ## Identifiers |
| |
| Prefer descriptive identifiers. If you are using domain-specific abbreviations, |
| document the expansion or provide a reference for further information. |
| |
| Every identifier that is defined as part of a protocol must be documented with |
| a comment explaining its interpretation (in the case of fields, types, and |
| parameters) or behavior (in the case of methods). |
| |
| ## Protocols |
| |
| All device interface protocols must use the `[Layout = "Simple"]` attribute. This |
| restriction exists to allow ease of implementing protocols in any of our |
| supported languages for driver development. |
| |
| ## Method Statuses |
| |
| Use a `zx.status` return to represent success and failure. If a method should not be |
| able to fail, do not provide a `zx.status` return. If the method returns multiple |
| values, the `zx.status` should come first. |
| |
| ## Arrays, Strings, and Vectors |
| |
| All arrays, strings, and vectors must be of bounded length. For arbitrarily |
| selected bounds, prefer to use a `const` identifier as the length so that |
| protocol consumers can programmatically inspect the length. |
| |
| ## Enums |
| |
| Prefer enums with explicit sizes (e.g. `enum Foo : uint32 { ... }`) to plain |
| integer types when a field has a constrained set of non-arithmetic values. |
| |
| ## Bitfields |
| |
| If your protocol has a bitfield, represent its values using `bits` values. |
| For details, see the ["bits"][bits] topic in the readability rubric. |
| |
| ## Non-channel based protocols |
| |
| Some interface protocols may negotiate a non-channel protocol as a performance |
| optimization (e.g. the zircon.ethernet.Device's GetFifos/SetIOBuffer methods). |
| FIDL does not currently support expressing these protocols. For now, represent |
| any shared data structures with `struct` definitions and provide detailed |
| documentation about participation in the protocol. Packed structures are not |
| currently supported. |
| |
| [fidl-style]: /docs/development/languages/fidl/guides/style.md |
| [fidl-api]: /docs/development/api/fidl.md |
| [bits]: /docs/development/api/fidl.md#bits |