// Copyright 2018 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 fidl.examples.bindingstest;

struct NoHandleStruct {
    string foo;
    int32 bar;
    vector<uint8> baz;
};

struct ExampleStruct {
    string foo;
    int32 bar;
    vector<uint8>? baz;
};

table ExampleTable {
    1: string foo;
    2: int32 bar;
    3: vector<uint8> baz;
};

xunion ExampleXunion {
    string foo;
    int32 bar;
    vector<uint8> baz;
};

bits ExampleBits {
    MEMBER_A = 2;
    MEMBER_B = 4;
    MEMBER_C = 8;
};

[Discoverable]
protocol TestServer {
    OneWayNoArgs();
    ReceivedOneWayNoArgs() -> (bool received);

    OneWayStringArg(string value);
    ReceivedOneWayString() -> (string value);

    OneWayThreeArgs(int32 x, uint64 y, NoHandleStruct z);
    ReceivedOneWayThreeArgs() -> (int32 x, uint64 y, NoHandleStruct z);

    OneWayExampleTable(ExampleTable value);
    ReceivedOneWayExampleTable() -> (ExampleTable received);

    TwoWayNoArgs() -> ();
    TwoWayStringArg(string value) -> (string value);
    TwoWayThreeArgs(int32 x, uint64 y, NoHandleStruct z) -> (int32 x, uint64 y, NoHandleStruct z);

    OneWayExampleXunion(ExampleXunion value);
    ReceivedOneWayExampleXunion() -> (ExampleXunion received);

    OneWayExampleBits(ExampleBits value);
    ReceivedOneWayExampleBits() -> (ExampleBits received);

    SendEmptyEvent();
    -> EmptyEvent();

    SendStringEvent(string value);
    -> StringEvent(string value);

    SendThreeArgEvent(int32 x, uint64 y, NoHandleStruct z);
    -> ThreeArgEvent(int32 x, uint64 y, NoHandleStruct z);

    SendMultipleEvents(int32 count, float64 intervalSeconds);
    -> MultipleEvent(int32 index);

    ReplySlowly(string value, float64 delaySeconds) -> (string value);

    ReplyWithErrorZero(bool with_error) -> () error uint32;
    ReplyWithErrorOne(bool with_error, string value) -> (string value) error uint32;
    ReplyWithErrorMore(bool with_error, string value, bool other_value) -> (string value, bool other_value) error uint32;

    ReplyWithErrorEnumZero(bool with_error) -> () error EnumOne;
    ReplyWithErrorEnumOne(bool with_error, string value) -> (string value) error EnumOne;
    ReplyWithErrorEnumMore(bool with_error, string value, bool other_value) -> (string value, bool other_value) error EnumOne;

    CloseConnection(float64 delaySeconds);

    -> NeverEvent();
};

enum EnumOne {
    ONE = 1;
    TWO = 2;
    THREE = 3;
};

enum EnumTwo {
    ONE = 1;
    TWO = 2;
    THREE = 3;
};

struct HandleStruct {
    string foo;
    int32 bar;
    handle baz;
};

union UnionOne {
    string foo;
    string bar;
    uint32 baz;
};

union UnionTwo {
    string foo;
    string bar;
    uint32 baz;
};

protocol SimpleServer {
    Ping() -> ();
};
