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

// [START wire-format-traversal-order]
type Cart = struct {
    items vector<Item>;
};

type Item = struct {
    product Product;
    quantity uint32;
};

type Product = struct {
    sku string;
    name string;
    description string:optional;
    price uint32;
};
// [END wire-format-traversal-order]

// [START wire-format-inlined-objects]
type Region = struct {
    rects vector<Rect>;
};

type Rect = struct {
    top_left Point;
    bottom_right Point;
};

type Point = struct {
    x uint32;
    y uint32;
};
// [END wire-format-inlined-objects]

// [START wire-format-tables]
type Value = table {
    1: command int16;
    2: data Circle;
    3: offset float64;
};
// [END wire-format-tables]

// [START wire-format-unions]
type UnionValue = strict union {
    1: command int16;
    2: data Circle;
    3: offset float64;
};
// [END wire-format-unions]

type CreateResource = struct {};

type ReleaseResource = struct {};

// [START command]
type Command = strict union {
    1: create_resource CreateResource;
    2: release_resource ReleaseResource;
};
// [END command]

// [START mode]
type Mode = strict bits {
    READ = 1;
    WRITE = 2;
};
// [END mode]

// [START hasher]
protocol Hasher {
    Hash(struct {
        value string;
    }) -> (struct {
        result array<uint8, 10>;
    });
};
// [END hasher]

// [START example-struct]
type MyRequest = struct {
    serial uint32;
    key string;
    options vector<uint32>;
};
// [END example-struct]
