// 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.
/// This library is for types only supported on fuchsia.
/// Where possible, new definitions should go into extra_messages.test.fidl
/// instead.
library fidl.test.coding.fuchsia;

using zx;

closed protocol LinearizerTest {
    strict VectorOfUint32(struct {
        v vector<uint32>;
    });
    strict VectorOfString(struct {
        v vector<string>;
    });
};

type StructWithHandle = resource struct {
    h zx.Handle;
    foo int32;
};

type StructWithManyHandles = resource struct {
    h1 zx.Handle;
    h2 zx.Handle;
    hs vector<zx.Handle>:2;
};

type TableOfStructWithHandle = resource table {
    1: a StructWithHandle;
    2: b StructWithManyHandles;
};

type SmallerTableOfStructWithHandle = resource table {
    2: b StructWithManyHandles;
};
