// 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" }}
#ifdef __Fuchsia__
class {{ .Name }};
#endif // __Fuchsia
{{- end }}

{{- define "ServiceDeclaration" }}
#ifdef __Fuchsia__
{{range .DocComments}}
///{{ . }}
{{- end}}
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 }}> {{ .MethodName }}() 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 }}
};
#endif // __Fuchsia
{{- end }}
`
