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

library fuchsia.examples.docs;

using zx;

// [START structs]
struct CirclePoint {
    float32 x;
    float32 y;
};

struct Color {
    float32 r;
    float32 g;
    float32 b;
};
// [END structs]

// [START structs-use]
struct Circle {
    bool filled;
    CirclePoint center; // CirclePoint will be stored in-line
    float32 radius;
    Color? color; // Color will be stored out-of-line
    bool dashed;
};
// [END structs-use]

// [START comments]
// this is a comment
/// and this one is too, but it also ends up in the generated code
struct MyStruct { // plain comment
    int32 f; // as is this one
}; // and this is the last one!
// [END comments]

// [START consts]
const bool ENABLED_FLAG = true;
const int8 OFFSET = -33;
const uint16 ANSWER = 42;
const uint16 ANSWER_IN_BINARY = 0b101010;
const uint32 POPULATION_USA_2018 = 330000000;
const uint64 DIAMOND = 0x183c7effff7e3c18;
const uint64 FUCHSIA = 4054509061583223046;
const string USERNAME = "squeenze";
const float32 MIN_TEMP = -273.15;
const float64 CONVERSION_FACTOR = 1.41421358;
const Beverage MY_DRINK = Beverage.WATER;
// [END consts]

// [START defaults]
struct Scene {
    uint32 background_rgb = 0xFF77FF; // fuchsia is the default background
    uint32 foreground_rgb; // there is no default foreground color
};
// [END defaults]

// [START primitives]
// A record which contains fields of a few primitive types.
struct Sprite {
    float32 x;
    float32 y;
    uint32 index;
    uint32 color;
    bool visible;
};
// [END primitives]

// [START bits]
strict bits InfoFeatures : uint8 {
    /// If present, this device represents WLAN hardware
    WLAN = 0x01;
    /// If present, this device is synthetic (not backed by h/w)
    SYNTH = 0x02;
    /// If present, this device receives all messages it sends
    LOOPBACK = 0x04;
};

// Underlying type is assumed to be uint32.
flexible bits AllowableSegments {
    TOLL_ROADS = 0b001;
    HIGHWAYS = 0b010;
    BIKE_PATHS = 0b100;
};
// [END bits]

// [START enums]
flexible enum Beverage : uint8 {
    WATER = 0;
    COFFEE = 1;
    TEA = 2;
    WHISKEY = 3;
};

// Underlying type is assumed to be uint32.
strict enum Vessel {
    CUP = 0;
    BOWL = 1;
    TUREEN = 2;
    JUG = 3;
};
// [END enums]

// [START enum-use]
// A record which contains two enum fields.
struct Order {
    Beverage beverage;
    Vessel vessel;
};
// [END enum-use]

// [START arrays]
// A record which contains some arrays.
struct Arrays {
    // array of exactly 16 floating point numbers
    array<float32>:16 matrix;

    // array of exactly 10 arrays of 4 strings each
    array<array<string>:4>:10 form;
};
// [END arrays]

// [START strings]
// A record which contains some strings.
struct Document {
    // title string, maximum of 40 bytes long
    string:40 title;

    // description string, may be null, no upper bound on size
    string? description;
};
// [END strings]

// [START vectors]
// A record which contains some vectors.
struct Vectors {
    // a vector of up to 10 integers
    vector<int32>:10 params;

    // a vector of bytes, no upper bound on size
    bytes blob;

    // a nullable vector of up to 24 strings
    vector<string>:24? nullable_vector_of_strings;

    // a vector of nullable strings, no upper bound on size
    vector<string?> vector_of_nullable_strings;

    // a vector of vectors of 16-element arrays of floating point numbers
    vector<vector<array<float32>:16>> complex;
};
// [END vectors]

// [START handles]
// A record which contains some handles.
resource struct Handles {
    // a handle of unspecified type
    handle h;

    // an optional channel
    zx.handle:CHANNEL? c;
};
// [END handles]

// [START tables]
table Profile {
    1: vector<string> locales;
    2: vector<string> calendars;
    3: vector<string> time_zones;
};
// [END tables]

struct Left {};
struct Right {};
// [START unions-use]
union Either {
    1: Left left;
    2: Right right;
};
// [END unions-use]

// [START strict-vs-flexible]
flexible union FlexibleEither {
    1: Left left;
    2: Right right;
};
// [END strict-vs-flexible]

protocol RealCalculator {};
// [START endpoints]
// A record which contains protocol-bound channels.
resource struct Record {
    // client endpoint of a channel bound to the Calculator protocol
    Calculator c;

    // server endpoint of a channel bound to the Science protocol
    request<Science> s;

    // optional client endpoint of a channel bound to the
    // RealCalculator protocol
    RealCalculator? r;
};
// [END endpoints]

// [START composition-base]
protocol SceneryController {
    SetBackground(Color color);
    SetForeground(Color color);
};
// [END composition-base]

// [START composition-inherit]
protocol Drawer {
    compose SceneryController;
    Circle(int32 x, int32 y, int32 radius);
    Square(int32 x, int32 y, int32 diagonal);
};

protocol Writer {
    compose SceneryController;
    Text(int32 x, int32 y, string message);
};
// [END composition-inherit]

// [START composition-multiple-1]
protocol FontController {
    SetPointSize(int32 points);
    SetFontName(string fontname);
    Italic(bool onoff);
    Bold(bool onoff);
    Underscore(bool onoff);
    Strikethrough(bool onoff);
};
// [END composition-multiple-1]

struct Time {};
// [START layering-clock]
protocol Clock {
    Now() -> (Time time);
    CurrentTimeZone() -> (string timezone);
};
// [END layering-clock]

// [START layering-horologist]
protocol Horologist {
    SetTime(Time time);
    SetCurrentTimeZone(string timezone);
};
// [END layering-horologist]

// [START layering-systemclock]
protocol SystemClock {
    compose Clock;
    compose Horologist;
};
// [END layering-systemclock]

// [START aliasing]
alias StoryID = string:MAX;
alias Chapters = vector<StoryID>:5;
// [END aliasing]

// [START aliasing-usage]
struct Message {
    StoryID baseline;
    Chapters chapters;
};
// [END aliasing-usage]

// [START builtin-aliases]
struct RawBytes {
    byte head;
    bytes rest;
};
// [END builtin-aliases]

// [START calculator]
enum DivisionError : uint32 {
    DIVIDE_BY_ZERO = 1;
};

protocol Calculator {
    Add(int32 a, int32 b) -> (int32 sum);
    Divide(int32 dividend, int32 divisor) ->
        (int32 quotient, int32 remainder) error DivisionError;
    Clear();
    -> OnError(uint32 status_code);
};
// [END calculator]

// [START maximum-recursion-depth]
struct InlineObject {
    string content_a;
    vector<OutOfLineStructAtLevel1> vector;
    TableInlineAtLevel0 table;
};

struct OutOfLineStructAtLevel1 {
    string content_b;
};

table TableInlineAtLevel0 {
    1: string content_c;
};
// [END maximum-recursion-depth]
