blob: 0f03b7141f70ccdc947e2ea2c32d3ac4bbd61a46 [file] [log] [blame] [view]
# FIDL lexicon
This document defines general terms that have a specific meaning in a FIDL
context. To learn more about specific FIDL topics, refer to the [FIDL
traihead][trailhead].
## Type, layout, constraint {#type-terms}
A **type** classifies a value in the FIDL type system. Types appear in the
`type-constructor` position defined in the [FIDL grammar][grammar]. For example,
`uint32`, `string:10`, and `vector<bool>` are types.
A **layout** is a parametrizable description of a type. It does not refer to a
single type, but describes a family of types obtained by instantiating the
layout with zero or more **layout parameters**. For example, `vector` is a
layout which takes one layout parameter, a type such as `vector<bool>` itself a
type. As another example, `array` is a layout which takes two layout parameters,
producing types such as `array<bool, 3>`.
The difference between layout and type can be subtle. For example, the statement
above that `uint32` is a type is not strictly correct. Rather, it is a layout
that takes zero parameters, distinct from the type obtained by instantiating it.
The FIDL syntax does not capture this distinction, so when `uint32` is used in
type position (e.g. `alias uint = uint32;`), it is really referencing the layout
`uint32` and implicitly instantiating it with zero layout parameters.
A **constraint** restricts a type to only allow values satisfying a predicate.
For example, the type `string:10` has the constraint `length <= 10` abbreviated
as `10`, meaning the string length cannot exceed 10 bytes.
Layouts and layout parameters affect how bytes are laid out in the [FIDL wire
format][wire-format], while constraints affect validation that restricts what
can be represented (see [RFC-050][rfc-050-layouts-constraints] for more detail).
Syntactically, layout parameters can only be applied to layouts, and constraints
can only be applied to types. For example:
```fidl
alias Bools = vector<bool>; // ok: layout parameter applied to layout
alias MaxTenBools = Bools:10; // ok: constraint applied to type
alias MaxTenBytes = Bools<byte>; // INVALID: layout parameter applied to type
alias MaxTen = vector:10; // INVALID: constraint applied to layout
```
The general form of a type instantiation is
L<L_1, L_2, ..., L_n>:<C_1, C_2, ..., C_n>
where `L` is a layout, `L_1` through `L_n` are layout parameters, and `C_1`
through `C_n` are constraints.
## Member, field, variant {#member-terms}
A **member** of a declaration is an individual element belonging to a
declaration, i.e. a declaration is comprised of zero, one, or many members.
For instance, consider the `Mode` bits declaration:
```fidl
{% includecode gerrit_repo="fuchsia/fuchsia" gerrit_path="examples/fidl/fuchsia.examples.docs/misc.test.fidl" region_tag="mode" %}
```
Both `READ` and `WRITE` are members.
When referring to members of structs or tables, we can more specifically refer
to these members as **fields**.
When referring to members of a union, we can more specifically refer to these
members as **variants**.
For example, consider the `Command` union declaration:
```fidl
{% includecode gerrit_repo="fuchsia/fuchsia" gerrit_path="examples/fidl/fuchsia.examples.docs/misc.test.fidl" region_tag="command" %}
```
The two variants are `create_resource` and `release_resource`.
Furthermore, the **selected variant** of an instance of a union is the current
value held by the union at that moment.
## Tag, and ordinal {#union-terms}
The **tag** is the target language variant discriminator, i.e. the specific
construct in a target language that is used to indicate the selected variant of
a union. For example, consider the following TypeScript representation of the
`Command` union:
```typescript
enum CommandTag {
Create,
Release,
}
interface Command {
tag: CommandTag,
data: CreateResource | ReleaseResource,
}
```
The tag of `Command` is `Command.tag` and has type `CommandTag`. The actual
values and type representing each variant of `Command` are up to the
implementation.
Note that some languages will not require a tag. For example, some languages use
pattern matching to branch on the variant of a union instead of having an
explicit tag value.
The **ordinal** is the on the wire variant discriminator, i.e. the value used to
indicate the variant of a union in the [FIDL wire format][wire-format]. The
ordinals are explicitly specified in the FIDL definition (in this example, 1 for
`create_resource` and 2 for `release_resource`).
## Encode {#encode}
Encoding refers to the process of serializing values from a target language into
the FIDL wire format.
For the C family of bindings (HLCPP, LLCPP), encode can have a more specific
meaning of taking bytes matching the layout of the FIDL wire format and patching
pointers and handles by replacing them with
`FIDL_ALLOC_PRESENT`/`FIDL_ALLOC_ABSENT` or
`FIDL_HANDLE_PRESENT`/`FIDL_HANDLE_ABSENT` in-place, moving handles into an
out-of-band handle table.
## Decode {#decode}
Decoding refers to the process of deserializing values from raw bytes in the
FIDL wire format into a value in a target language.
For the C family of bindings (HLCPP, LLCPP), decode can have a more specific
meaning of taking bytes matching the layout of the FIDL wire format and patching
pointers and handles by replacing `FIDL_ALLOC_PRESENT`/`FIDL_ALLOC_ABSENT` or
`FIDL_HANDLE_PRESENT`/`FIDL_HANDLE_ABSENT` with the "real" pointer/handle
values in-place, moving handles out of an out-of-band handle table.
## Validate {#validate}
Validation is the process of checking if constraints from the FIDL definition
are satisfied for a given value. Validation occurs both when encoding a value
before being sent, or when decoding a value after receiving it. Example
constraints are vector bounds, handle constraints, and the valid encoding of a
string as UTF-8.
When validation fails, the bindings surface the error to user code, either by
returning it directly or via an error callback.
## Result/error type {#result}
For methods with error types specified:
```fidl
DoWork() -> (struct { result Data; }) error uint32
```
The **result type** refers to the entire message that would be received by a
server for this method, i.e. the union that consists of either a result of
`Data` or an error of `uint32`. The error type in this case is `uint32`, whereas
`Data` can be referred to as either the response type or the success type.
<!-- xrefs -->
[trailhead]: /docs/development/languages/fidl/README.md
[wire-format]: /docs/reference/fidl/language/wire-format
[grammar]: /docs/reference/fidl/language/grammar.md#grammar
[rfc-050-layouts-constraints]: /docs/contribute/governance/rfcs/0050_syntax_revamp.md#layouts-constraints