// Copyright 2022 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 test.conformance;

closed protocol Protocol {};

type StructOfEndpoints = resource struct {
    client_end client_end:Protocol;
    optional_client_end client_end:<Protocol, optional>;
    server_end server_end:Protocol;
    optional_server_end server_end:<Protocol, optional>;
};

type TableOfEndpoints = resource struct {
    t @generated_name("TableOfEndpointsTable") resource table {
        1: client_end client_end:Protocol;
        2: server_end server_end:Protocol;
    };
};

type UnionOfEndpoints = resource struct {
    u @generated_name("UnionOfEndpointsUnion") resource union {
        1: client_end client_end:Protocol;
        2: server_end server_end:Protocol;
    };
};
