Expand description

fidl table validation tools.

This crate’s macro generates code to validate fidl tables.

Import using fidl_table_validation::* to inherit the macro’s imports.

§Basic Example

// Some fidl table defined somewhere...
struct FidlTable {
    required: Option<usize>,
    optional: Option<usize>,
    has_default: Option<usize>,

struct ValidatedFidlTable {
    // The default is #[fidl_field_type(required)]
    required: usize,
    optional: Option<usize>,
    #[fidl_field_type(default = 22)]
    has_default: usize,

This code generates a TryFrom implementation for ValidatedFidlTable:

pub enum FidlTableValidationError {

impl TryFrom<FidlTable> for ValidatedFidlTable {
    type Error = FidlTableValidationError;
    fn try_from(src: FidlTable) -> Result<ValidatedFidlTable, Self::Error> { .. }

and also a From implementation for FidlTable, so you can get a FidlTable using validated.into().

§Custom Validations

When tables have logical relationships between fields that must be checked, you can use a custom validator:

struct FidlTableValidator;

impl Validate<ValidatedFidlTable> for FidlTableValidator {
    type Error = String; // Can be any error type.
    fn validate(candidate: &ValidatedFidlTable) -> Result<(), Self::Error> {
        match candidate.required {
            10 => {
                Err(String::from("10 is not a valid value!"))
            _ => Ok(())

struct ValidFidlTable {

§Non-literal defaults

Attribute syntax for name = value only supports literals. Another attribute for expressing defaults is used for consts. Or any type that has a Default impl can simply omit the literal.

const MY_DEFAULT: MyEnum = MyEnum::MyVariant;

struct ValidatedFidlTable {
    has_default_impl: Vec<u32>,
    has_default: MyEnum,

This adds a Logical(YourErrorType) variant to the generated error enum.



  • Validations on T that can be run during construction of a validated fidl table by adding the attribute #[fidl_table_validator(YourImpl)] to the valid struct.

Derive Macros§