Certain FIDL types can be made optional with no change to the wire shape of their containing message with the addition of the :optional
constraint. Further, the table
layout is always optional, while the struct
layout never is. To make a struct
optional, it must be wrapped in a box<T>
, thereby changing the wire shape of its containing message.
Base type | Optional version | Does optionality change the wire layout? |
---|---|---|
struct {...} | box<struct {...}> | Yes |
table {...} | table {...} | No |
union {...} | union {...}:optional | No |
vector<T> | vector<T>:optional | No |
string | string:optional | No |
zx.Handle | zx.Handle:optional | No |
client_end:P | client_end:<P, optional> | No |
server_end:P | server_end:<P, optional> | No |
All other types (bits
, enum
, array<T, N>
, and the primitive types) cannot be made optional.
<<../examples/key_value_store/_callout.md>> <<../examples/key_value_store/_support_trees_tutorial.md>>