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

package codegen

const sourceFileTmpl = `
{{- define "GenerateSourceFile" -}}
// WARNING: This file is machine generated by fidlgen.

#![allow(
	unused_parens, // one-element-tuple-case is not a tuple
	unused_mut, // not all args require mutation, but many do
	nonstandard_style, // auto-caps does its best, but is not always successful
)]

#![recursion_limit="512"]

#[cfg(target_os = "fuchsia")]
#[allow(unused_imports)]
use fuchsia_zircon as zx;

#[allow(unused_imports)]
use {
	bitflags::bitflags,
	fuchsia_zircon_status as zx_status,
  	futures::future::{self, MaybeDone, TryFutureExt},
	fidl::{
		fidl_empty_struct,
		fidl_flexible_bits,
		fidl_flexible_enum,
		fidl_strict_bits,
		fidl_strict_enum,
		fidl_struct_copy,
		fidl_struct,
		fidl_table,
		fidl_xunion,
		wrap_handle_metadata,
		encoding::{Encodable as _, Decodable as _},
		client::{
			QueryResponseFut,
			decode_transaction_body_fut,
		},
	},
};

{{/*
	For FIDL tracing, the Rust bindings are assigned a bindings enum of 6. See
	fidl-trace/trace_impl.cc, enum LogContext for more context.

	This constant will be unused in a build that has FIDL tracing disabled,
	since this constant is used only within trace_duration! macros that will
	expand to no-ops. However, the constant needs to be present, since the
	constant is evaluated before the macro expansion.

	The constant starts with an underscore to avoid clashing with FIDL
	declarations, which are not allowed to start with underscores.
*/ -}}
{{ if .Protocols -}}
const _FIDL_TRACE_BINDINGS_RUST: u32 = 6;
{{ end -}}

{{ range $bits := .Bits -}}
{{ template "BitsDeclaration" $bits }}
{{ end -}}
{{ range $const := .Consts -}}
{{ template "ConstDeclaration" $const }}
{{ end -}}
{{ range $enum := .Enums -}}
{{ template "EnumDeclaration" $enum }}
{{ end -}}
{{ range $result := .Results -}}
{{ template "ResultDeclaration" $result}}
{{ end -}}
{{ range $union := .Unions -}}
{{ template "UnionDeclaration" $union }}
{{ end -}}
{{ range $struct := .Structs -}}
{{ template "StructDeclaration" $struct }}
{{ end -}}
{{ range $table := .Tables -}}
{{ template "TableDeclaration" $table }}
{{ end -}}
{{ range $hmw := .HandleMetadataWrappers -}}
{{ template "HandleMetadataWrapperDeclaration" $hmw }}
{{ end -}}
{{ range $protocol := .Protocols -}}
{{ range $transport, $_ := .Transports -}}
{{ if eq $transport "Channel" -}}{{ template "ProtocolDeclaration" $protocol }}{{- end }}
{{ end -}}
{{ end -}}
{{ range $service := .Services -}}
{{ range $transport, $_ := .Transports -}}
{{ if eq $transport "Channel" -}}{{ template "ServiceDeclaration" $service }}{{- end }}
{{ end -}}
{{ end -}}
{{- end -}}
`
