// 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 implementationTemplate = `
{{- define "Implementation" -}}
{{- UseNatural -}}
// WARNING: This file is machine generated by fidlgen.

#include <{{ .PrimaryHeader }}>

{{ if IncludeProxiesAndStubs -}}
#include "lib/fidl/cpp/internal/implementation.h"
{{ else -}}
#include "lib/fidl/cpp/internal/natural_types_implementation.h"
{{- end }}

{{ template "Implementation/NaturalTypes" . }}
{{ if IncludeProxiesAndStubs -}}
{{ template "Implementation/ProxiesAndStubs" . }}
{{- end }}

{{ EndOfFile }}

{{ end }}

{{- define "Implementation/NaturalTypes" }}
//
// Domain objects definitions (i.e. "natural types" in unified bindings)
//

{{- range .Decls }}
{{- if Eq .Kind Kinds.Bits }}{{ template "BitsDefinition" . }}{{- end }}
{{- if Eq .Kind Kinds.Const }}{{ template "ConstDefinition" . }}{{- end }}
{{- if Eq .Kind Kinds.Enum }}{{ template "EnumDefinition" . }}{{- end }}
{{- if Eq .Kind Kinds.Struct }}{{ template "StructDefinition" . }}{{- end }}
{{- if Eq .Kind Kinds.Union }}{{ template "UnionDefinition" . }}{{- end }}
{{- if Eq .Kind Kinds.Table }}{{ template "TableDefinition" . }}{{- end }}
{{- end }}

{{- end }}

{{- define "Implementation/ProxiesAndStubs" }}
//
// Proxies and stubs definitions
//

{{- range .Decls }}
{{- if Eq .Kind Kinds.Protocol }}{{ template "DispatchProtocolDefinition" . }}{{- end }}
{{- end }}

{{- end }}

{{- define "DispatchProtocolDefinition" -}}
{{- range $transport, $_ := .Transports }}
{{- if eq $transport "Channel" -}}{{ template "ProtocolDefinition" $ }}{{- end }}
{{- end }}
{{- end -}}
`
