# 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
