// Copyright 2020 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.

// NOTE: This file contains the source for FIDL examples used in documentation.
// Check that associated docs are kept in sync when modifying this file. You
// can find usages by grepping for
// `gerrit_path="examples/fidl/fuchsia.examples/types.fidl"`

// [START lib]
library fuchsia.examples;
// [END lib]

// [START consts]
const uint8 BOARD_SIZE = 9;
const string NAME = "Tic-Tac-Toe";
// [END consts]

// [START bits]
bits FileMode : uint16 {
    READ = 0b001;
    WRITE = 0b010;
    EXECUTE = 0b100;
};
// [END bits]

// TODO(fxbug.dev/65466): Make flexible bits work with libfuzzer.
[BindingsDenylist = "libfuzzer"]
// [START flexible_bits]
flexible bits FlexibleFileMode : uint16 {
    READ = 0b001;
    WRITE = 0b010;
    EXECUTE = 0b100;
};
// [END flexible_bits]

// [START enums]
enum LocationType {
    MUSEUM = 1;
    AIRPORT = 2;
    RESTAURANT = 3;
};
// [END enums]

// TODO(fxbug.dev/65466): Make flexible enums work with libfuzzer.
[BindingsDenylist = "libfuzzer"]
// [START flexible_enums]
flexible enum FlexibleLocationType {
    MUSEUM = 1;
    AIRPORT = 2;
    RESTAURANT = 3;
};
// [END flexible_enums]

// [START structs]
struct Color {
    uint32 id;
    string:MAX_STRING_LENGTH name = "red";
};
// [END structs]

// [START unions]
union JsonValue {
    1: reserved;
    2: int32 int_value;
    3: string:MAX_STRING_LENGTH string_value;
};
// [END unions]

// [START flexible_unions]
flexible union FlexibleJsonValue {
    1: reserved;
    2: int32 int_value;
    3: string:MAX_STRING_LENGTH string_value;
};
// [END flexible_unions]

// [START tables]
table User {
    1: reserved;
    2: uint8 age;
    3: string:MAX_STRING_LENGTH name;
};
// [END tables]

// [START protocols-preface]
struct GameState {
};
// [END protocols-preface]

// NOTE: a version of this protocol using error types is also used in the
// bindings reference docs, but is not tested
// [START protocols]
protocol TicTacToe {
    StartGame(bool start_first);
    MakeMove(uint8 row, uint8 col) -> (bool success, GameState? new_state);
    -> OnOpponentMove(GameState new_state);
};
// [END protocols]
