// Copyright 2019 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 serviceTemplate = `
{{- define "ServiceForwardDeclaration" }}
{{ EnsureNamespace . }}
{{- IfdefFuchsia -}}
class {{ .Name }};
{{- EndifFuchsia -}}
{{- end }}

{{- define "ServiceDeclaration" }}
{{ EnsureNamespace . }}
{{- IfdefFuchsia -}}
{{- .Docs }}
class {{ .Name }} final {
 public:
  class Handler;

  static constexpr char Name[] = "{{ .ServiceName }}";

  explicit {{ .Name }}(std::unique_ptr<::fidl::ServiceConnector> service)
      : service_(std::move(service)) {}

  explicit operator bool() const { return !!service_; }

  {{- range .Members }}
  /// Returns a |fidl::MemberConnector| which can be used to connect to the member protocol "{{ .Name }}".
  ::fidl::MemberConnector<{{ .ProtocolType }}> {{ .Name }}() const {
    return ::fidl::MemberConnector<{{ .ProtocolType }}>(service_.get(), "{{ .Name }}");
  }
  {{- end }}

 private:
  std::unique_ptr<::fidl::ServiceConnector> service_;
};

/// Facilitates member protocol registration for servers.
class {{ .Name }}::Handler final {
 public:
  /// Constructs a new |Handler|. Does not take ownership of |service|.
  explicit Handler(::fidl::ServiceHandlerBase* service)
  {{- with .Members }}
      : service_(service) {}
  {{- else }}
      { (void)service; }
  {{- end }}

  {{- range .Members }}
  /// Adds member "{{ .Name }}" to the service instance. |handler| is invoked when a connection
  /// is made to the member protocol.
  ///
  /// # Errors
  ///
  /// Returns ZX_ERR_ALREADY_EXISTS if the member was already added.
  zx_status_t add_{{ .Name }}(::fidl::InterfaceRequestHandler<{{ .ProtocolType }}> handler) {
    return service_->AddMember("{{ .Name }}", std::move(handler));
  }
  {{- end }}

 private:
  {{- with .Members }}
  ::fidl::ServiceHandlerBase* const service_;
  {{- end }}
};
{{- EndifFuchsia -}}
{{- end }}
`
