namespace AnnotatedBinary;

enum Food : byte {
  None = 0,
  Apple = 1,
  Banana = 2,
  Kiwi = 3,
}

table Baz {
  meal:Food = Banana;
}

table Bar {
  a:double = 3.14;
  b:float = 1.68;
  c:Baz;
}

union BarBaz {
  Bar, Baz
}

union Measurement {
  Tolerance, Dimension
}

struct Tolerance {
  width:uint8;
}

union Any {
  Bar, Tolerance
}

struct Dimension {
  values:[int:3];
  tolerances:[Tolerance:3];
}

struct Building {
  floors:int;
  doors:int;
  windows:int;
  dimensions:Dimension;
}

struct Location {
  latitude:double;
  longitude:double;
}

table Foo {
  counter:int;
  healthy:bool;
  level:long = 99;
  meal:Food = Apple;
  bar:Bar;
  home:Building;
  name:string;
  // Vector of tables
  bars:[Bar];
  // Union of tables
  bar_baz:BarBaz;
  // Vector of Scalars
  accounts:[uint16];
  bob:string;
  alice:string;
  // Optional Scalars
  maybe_i32: int32 = null;
  default_i32: int32 = 42;
  just_i32: int32;
  // Vector of strings
  names:[string];
  // Vector of structs
  points_of_interest:[Location];
  // Vector of unions
  foobars:[BarBaz];
  // Union of structs
  measurement:Measurement;
  // Union of struct/table
  anything:Any;
  // Default floating point
  temperature:float=98.6;
  // Not present object
  teetotaler:Bar;
  charlie:string;
}

file_identifier "ANNO";

root_type Foo;