# Copyright 2018 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.
#
# WARNING: This file is machine generated by fidlgen.

include <fidl/test/doccomments/c/fidl.h>
fidl_test_doccomments_MyStrictEnum = fidl_test_doccomments_MyStrictEnum_FOO, fidl_test_doccomments_MyStrictEnum_BAR
fidl_test_doccomments_MyFlexibleEnum = fidl_test_doccomments_MyFlexibleEnum_FOO, fidl_test_doccomments_MyFlexibleEnum_BAR
fidl_test_doccomments_MyStrictBits = fidl_test_doccomments_MyStrictBits_MY_FIRST_BIT, fidl_test_doccomments_MyStrictBits_MY_OTHER_BIT
fidl_test_doccomments_MyFlexibleBits = fidl_test_doccomments_MyFlexibleBits_MY_FIRST_BIT, fidl_test_doccomments_MyFlexibleBits_MY_OTHER_BIT
fidl_test_doccomments_StructInLine {
       field int32
} [packed]
fidl_test_doccomments_StructOutOfLine {
       void void
} [packed]
fidl_test_doccomments_StructHandles {
       void void
} [packed]
fidl_test_doccomments_StrictUnionInLine [
       field fidl_union_member[1, int32]
]
fidl_test_doccomments_StrictUnionOutOfLine [
       void void
][varlen]
fidl_test_doccomments_StrictUnionHandles [
       void void
][varlen]
fidl_test_doccomments_FlexibleUnionInLine [
       field fidl_union_member[1, int32]
]
fidl_test_doccomments_FlexibleUnionOutOfLine [
       void void
][varlen]
fidl_test_doccomments_FlexibleUnionHandles [
       void void
][varlen]


fidl_test_doccomments_InterfaceMethodRequest {
       hdr fidl_message_header[6649887292072346213]
} [packed]
fidl_test_doccomments_InterfaceMethodRequestHandles {
       void void
} [packed]
fidl_test_doccomments_InterfaceOnEventEvent {
       hdr fidl_message_header[3999525675942213370]
} [packed]
fidl_test_doccomments_InterfaceOnEventEventHandles {
       void void
} [packed]

resource zx_chan_fidl_test_doccomments_Interface_client[zx_chan]
resource zx_chan_fidl_test_doccomments_Interface_server[zx_chan]

zx_channel_create$fidl_test_doccomments_Interface(options const[0], out0 ptr[out, zx_chan_fidl_test_doccomments_Interface_client], out1 ptr[out, zx_chan_fidl_test_doccomments_Interface_server])
fdio_service_connect$fidl_test_doccomments_Interface(path ptr[in, string["/svc/"]], handle zx_chan_fidl_test_doccomments_Interface_server)
zx_channel_write$fidl_test_doccomments_InterfaceMethod(handle zx_chan_fidl_test_doccomments_Interface_client, options const[0], bytes ptr[in, fidl_test_doccomments_InterfaceMethodRequest], num_bytes bytesize[bytes], handles ptr[in, fidl_test_doccomments_InterfaceMethodRequestHandles], num_handles bytesize[handles])
zx_channel_read$fidl_test_doccomments_InterfaceOnEvent(handle zx_chan_fidl_test_doccomments_Interface_client, options const[0], bytes ptr[out, array[int8, ZX_CHANNEL_MAX_MSG_BYTES]], num_bytes bytesize[bytes], handles ptr[out, fidl_test_doccomments_InterfaceOnEventEventHandles], num_handles bytesize[handles], actual_bytes ptr[out, int32], actual_handles ptr[out, int32])

