module fuzz.mojom;

[Extensible]
enum FuzzEnum {
  FUZZ_VALUE0,
  FUZZ_VALUE1,
  FUZZ_VALUE2
};

struct FuzzDummyStruct {
  int8 dummy;
};

union FuzzUnion {
  bool fuzz_bool;
  int8 fuzz_int8;
  uint8 fuzz_uint8;
  int16 fuzz_int16;
  uint16 fuzz_uint16;
  int32 fuzz_int32;
  uint32 fuzz_uint32;
  int64 fuzz_int64;
  uint64 fuzz_uint64;
  float fuzz_float;
  double fuzz_double;
  string fuzz_string;
  array<int8> fuzz_primitive_array;
  array<FuzzDummyStruct> fuzz_struct_array;
  map<string, int8> fuzz_primitive_map;
  map<string, array<string>> fuzz_array_map;
  map<string, FuzzDummyStruct> fuzz_struct_map;
  map<FuzzEnum, FuzzUnion> fuzz_union_map;

  array<map<FuzzEnum, map<int8, array<FuzzUnion?>?>>>? fuzz_complex;
};

struct FuzzStruct {
  bool fuzz_bool;
  int8 fuzz_int8;
  uint8 fuzz_uint8;
  int16 fuzz_int16;
  uint16 fuzz_uint16;
  int32 fuzz_int32;
  uint32 fuzz_uint32;
  int64 fuzz_int64;
  uint64 fuzz_uint64;
  float fuzz_float;
  double fuzz_double;
  string fuzz_string;

  array<int8> fuzz_primitive_array;
  map<string, int8> fuzz_primitive_map;
  map<string, array<string>> fuzz_array_map;
  map<FuzzEnum, FuzzUnion> fuzz_union_map;
  array<FuzzUnion> fuzz_union_array;
  array<FuzzStruct> fuzz_struct_array;
  array<int8>? fuzz_nullable_array;

  array<map<FuzzEnum, map<int8, array<FuzzStruct?>?>>>? fuzz_complex;
};

interface FuzzDummyInterface {
  Ping();
};

interface FuzzInterface {
  FuzzBasic();
  FuzzBasicResp() => ();
  [Sync]
  FuzzBasicSyncResp() => ();

  FuzzArgs(FuzzStruct a, FuzzStruct? b);
  FuzzArgsResp(FuzzStruct a, FuzzStruct? b) => ();
  [Sync]
  FuzzArgsSyncResp(FuzzStruct a, FuzzStruct? b) => ();

  FuzzAssociated(associated FuzzDummyInterface& request);
};