// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
library test.fidlcodec.examples;

using zx;

closed protocol Echo {
    strict EchoString(struct {
        value string:<100, optional>;
    }) -> (struct {
        response string:<100, optional>;
    });
};

type Named = struct {
    s string:200;
};

alias NamedAlias = Named;

alias StringAlias = string:100;

alias VectorAlias = vector<NamedAlias>:20;

alias HandleAlias = zx.Handle;

closed protocol FidlCodecTestProtocol {
    strict Empty();
    strict String(struct {
        s string:100;
    });
    strict Named(Named);
    strict Bool(struct {
        b bool;
    });
    strict Int8(struct {
        i8 int8;
    });
    strict Int16(struct {
        i16 int16;
    });
    strict Int32(struct {
        i32 int32;
    });
    strict Int64(struct {
        i64 int64;
    });
    strict Uint8(struct {
        ui8 uint8;
    });
    strict Uint16(struct {
        ui16 uint16;
    });
    strict Uint32(struct {
        ui32 uint32;
    });
    strict Uint64(struct {
        ui64 uint64;
    });
    strict Float32(struct {
        f32 float32;
    });
    strict Float64(struct {
        f64 float64;
    });

    strict Complex(struct {
        real int32;
        imaginary int32;
    });
    strict StringInt(struct {
        s string:100;
        i32 int32;
    });
    strict StringIntTable(table {
        1: s string:100;
        2: i32 int32;
    });
    strict StringIntUnion(union {
        1: s string:100;
        2: i32 int32;
    });
    strict StructIntUnion(union {
        1: structomatic struct {
            s string:100;
            i32 int32;
        };
        2: i32 int32;
    });
    strict Array1(struct {
        b_1 array<int32, 1>;
    });
    strict Array2(struct {
        b_2 array<int32, 2>;
    });
    strict Vector(struct {
        v_1 vector<int32>:<10, optional>;
    });

    strict TwoStringArrayInt(struct {
        arr array<string:100, 2>;
        i32 int32;
    });
    strict TwoStringVectorInt(struct {
        vec vector<string:100>:10;
        i32 int32;
    });
    strict TwoStringVectors(struct {
        v_1 vector<string:100>:10;
        v_2 vector<string:100>:10;
    });
    strict VectorUint8(struct {
        v vector<uint8>:100;
    });
    strict VectorUint32(struct {
        v vector<uint32>:100;
    });
    strict VectorStruct(struct {
        v vector<SmallStruct>:100;
    });
    strict ArrayStruct(struct {
        a array<SmallStruct, 3>;
    });
    strict VectorStruct2(struct {
        v vector<SmallUnevenStruct>:100;
    });
    strict ArrayStruct2(struct {
        a array<SmallUnevenStruct, 3>;
    });

    strict Struct(struct {
        p PrimitiveTypes;
    });
    strict BoolStruct(struct {
        s BoolStructType;
    });
    strict NullableStruct(struct {
        p box<PrimitiveTypes>;
    });
    strict NullableStructAndInt(struct {
        p box<PrimitiveTypes>;
        i int32;
    });
    strict ArrayNullableStruct(struct {
        a array<box<TwoStringStruct>, 3>;
    });

    strict SmallStructAfterByte(struct {
        u uint8;
        s1 SmallStruct;
        s2 SmallStruct;
    });

    strict TwoStringStructInt(struct {
        s TwoStringStruct;
        i32 int32;
    });
    strict TwoStringNullableStructInt(struct {
        s box<TwoStringStruct>;
        i32 int32;
    });

    strict Union(struct {
        isu IntStructUnion;
        i int32;
    });
    strict NullableUnion(struct {
        isu IntStructUnion:optional;
        i int32;
    });
    strict NullableUnionIntFirst(struct {
        i int32;
        isu IntStructUnion:optional;
    });
    strict ArrayNullableUnion(struct {
        a array<IntStructUnion:optional, 3>;
    });

    strict XUnion(struct {
        isu IntStructXunion;
        i int32;
    });
    strict NullableXUnion(struct {
        isu IntStructXunion:optional;
        i int32;
    });
    strict NullableXUnionIntFirst(struct {
        i int32;
        isu IntStructXunion:optional;
    });

    strict ShortUnion(struct {
        u U8U16Union;
        i int32;
    });
    strict ShortUnionReserved(struct {
        u U8U16UnionReserved;
        i int32;
    });
    strict ShortXUnion(struct {
        u U8U16Xunion;
        i int32;
    });
    strict RecursiveUnion(struct {
        e DataElement;
    });

    strict U8U16UnionStruct(struct {
        s U8U16UnionStructType;
    });

    strict DefaultEnumMessage(struct {
        ev DefaultEnum;
    });
    strict I8EnumMessage(struct {
        ev I8Enum;
    });
    strict I16EnumMessage(struct {
        ev I16Enum;
    });
    strict I32EnumMessage(struct {
        ev I32Enum;
    });
    strict I64EnumMessage(struct {
        ev I64Enum;
    });

    strict DefaultBitsMessage(struct {
        v DefaultBits;
    });
    strict I8BitsMessage(struct {
        v I8Bits;
    });
    strict I16BitsMessage(struct {
        v I16Bits;
    });
    strict I32BitsMessage(struct {
        v I32Bits;
    });
    strict I64BitsMessage(struct {
        v I64Bits;
    });

    strict Table(struct {
        table ValueTable;
        i int32;
    });

    strict TableToBool(struct {
        setattr ValueTable;
        i int32;
    }) -> (struct {
        finally bool;
    });

    strict Handle(resource struct {
        ch zx.Handle:CHANNEL;
    });
    strict NullableHandle(resource struct {
        ch zx.Handle:<CHANNEL, optional>;
    });
    strict HandleStructMessage(resource struct {
        hs HandleStruct;
    });
    strict HandleTableMessage(resource struct {
        t HandleTable;
    });
    strict TraversalOrderMessage(resource struct {
        t TraversalOrder;
    });
    strict TraversalMainMessage(resource struct {
        v vector<box<TraversalMain>>:3;
        s box<TraversalStruct>;
    });

    // Named ProtocolMethod because the natural bindings
    // do not support a method named Protocol.
    strict ProtocolMethod(resource struct {
        ch client_end:ParamProtocol;
    });
};

type BoolStructType = struct {
    b bool;
};

type PrimitiveTypes = struct {
    s string:100;
    b bool;
    i8 int8;
    i16 int16;
    i32 int32;
    i64 int64;
    u8 uint8;
    u16 uint16;
    u32 uint32;
    u64 uint64;
    f32 float32;
    f64 float64;
};

type SmallStruct = struct {
    a uint8;
    b uint8;
    c uint8;
};

type SmallUnevenStruct = struct {
    a uint32;
    b uint8;
};

type TwoStringStruct = struct {
    value1 string:100;
    value2 string:100;
};

type IntStructUnion = strict union {
    1: variant_i int32;
    2: variant_tss TwoStringStruct;
};

type IntStructXunion = flexible union {
    1: variant_i int32;
    2: variant_tss TwoStringStruct;
};

type U8U16Union = strict union {
    1: variant_u8 uint8;
    2: variant_u16 uint16;
};

type U8U16UnionReserved = strict union {
    1: variant_u8 uint8;
    3: variant_u16 uint16;
};

type U8U16Xunion = flexible union {
    1: variant_u8 uint8;
    2: variant_u16 uint16;
};

// Mostly copied from sdk/fidl/fuchsia.bluetooth.bredr/service.fidl

const MAX_SEQUENCE_LENGTH uint8 = 255;
const MAX_STRING_LENGTH uint16 = 1024;
const ALWAYS_TRUE bool = true;
const PI float32 = 3.14159265;
const BITS DefaultEnum = DefaultEnum.X;

type DataElement = strict union {
    1: int8 int8;
    2: int16 int16;
    3: int32 int32;
    4: int64 int64;
    5: uint8 uint8;
    6: uint16 uint16;
    7: uint32 uint32;
    8: uint64 uint64;
    9: str string:MAX_STRING_LENGTH;
    10: b bool;
    11: sequence vector<DataElement:optional>:MAX_SEQUENCE_LENGTH;
    12: alternatives vector<DataElement:optional>:MAX_SEQUENCE_LENGTH;
};

type U8U16UnionStructType = struct {
    u U8U16Union;
};

type DefaultEnum = strict enum {
    X = 23;
};

type I8Enum = strict enum : int8 {
    X = -23;
};

type I16Enum = strict enum : int16 {
    X = -23;
};

type I32Enum = strict enum : int32 {
    X = -23;
};

type I64Enum = strict enum : int64 {
    X = -23;
};

type DefaultBits = strict bits {
    A = 1;
    B = 2;
    C = 4;
    D = 8;
};

type I8Bits = strict bits : uint8 {
    A = 1;
    B = 2;
    C = 4;
    D = 8;
};

type I16Bits = strict bits : uint16 {
    A = 0x100;
    B = 0x200;
    C = 0x400;
    D = 0x800;
};

type I32Bits = strict bits : uint64 {
    A = 0x10000;
    B = 0x20000;
    C = 0x40000;
    D = 0x80000;
};

type I64Bits = strict bits : uint64 {
    A = 0x100000000;
    B = 0x200000000;
    C = 0x400000000;
    D = 0x800000000;
};

type ValueTable = table {
    1: first_int16 int16;
    2: second_struct TwoStringStruct;
    4: third_union IntStructUnion;
};

type HandleStruct = resource struct {
    h1 zx.Handle:CHANNEL;
    h2 zx.Handle:CHANNEL;
    h3 zx.Handle:CHANNEL;
};

type OptHandleStruct = resource struct {
    sh1 zx.Handle:<CHANNEL, optional>;
    sh2 zx.Handle:<CHANNEL, optional>;
};

type HandleTable = resource table {
    1: h1 zx.Handle:CHANNEL;
    2: s1 OptHandleStruct;
};

type TraversalOrder = resource struct {
    s box<OptHandleStruct>;
    h1 zx.Handle:<CHANNEL, optional>;
    h2 zx.Handle:<CHANNEL, optional>;
};

type TraversalStruct = resource struct {
    a uint32;
    b zx.Handle:<CHANNEL, optional>;
};

type TraversalMain = resource struct {
    x uint32;
    y box<TraversalStruct>;
};

closed protocol ParamProtocol {
    strict Method();
};
