{{/*
// Copyright 2021 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.
*/}}

{{- define "Method:Result:WireMessagingHeader" }}
{{- EnsureNamespace "" }}

template<>
class [[nodiscard]] {{ .WireResult }} final : public ::fidl::Status {
 public:
  {{ .WireResult.Self }}(
      ::{{ .Transport.Namespace }}::UnownedClientEnd<{{ .Protocol }}> client,
      {{ .WireTransactionalRequest }}* request
      {{- if .HasResponse }}, std::optional<zx::time> deadline = std::nullopt{{ end }}
  );

  explicit {{ .WireResult.Self }}(const ::fidl::Status& result) : ::fidl::Status(result) {}
  {{ .WireResult.Self }}({{ .WireResult.Self }}&&) = delete;
  {{ .WireResult.Self }}(const {{ .WireResult.Self }}&) = delete;
  {{ .WireResult.Self }}& operator=({{ .WireResult.Self }}&&) = delete;
  {{ .WireResult.Self }}& operator=(const {{ .WireResult.Self }}&) = delete;
  ~{{ .WireResult.Self }}() = default;

  {{- if .HasWireResultBase }}
    {{ .WireResultBase }}* Unwrap() {
      {{- if .Result }}
        return &result_.value();
      {{- else }}
        ZX_ASSERT(ok());
        return &decoded_.Value()->body;
      {{- end }}
    }
    const {{ .WireResultBase }}* Unwrap() const {
      {{- if .Result }}
        return &result_.value();
      {{- else }}
        ZX_ASSERT(ok());
        return &decoded_.Value()->body;
      {{- end }}
    }

    {{ .WireResultBase }}& value() { return *Unwrap(); }
    const {{ .WireResultBase }}& value() const { return *Unwrap(); }

    {{ .WireResultBase }}* operator->() { return &value(); }
    const {{ .WireResultBase }}* operator->() const { return &value(); }

    {{ .WireResultBase }}& operator*() { return value(); }
    const {{ .WireResultBase }}& operator*() const { return value(); }
  {{- end }}

  {{- if .HasResponse }}
   private:
    {{ .Response.ClientAllocationV1.BackingBufferType }} bytes_;
    ::fidl::internal::DecodedValue<{{ .WireTransactionalResponse }}> decoded_;
    {{- if and .Result .HasWireResultBase }}
      std::optional<{{ .WireResultBase }}> result_ = std::nullopt;
    {{- end }}
  {{- end }}
};

{{- end }}



{{- define "Method:Result:WireMessagingSource" }}
{{- IfdefFuchsia -}}
{{- EnsureNamespace "" }}
{{ .WireResult }}::{{ .WireResult.Self }}(
    ::{{ .Transport.Namespace }}::UnownedClientEnd<{{ .Protocol }}> client,
    {{ .WireTransactionalRequest }}* request
    {{- if .HasResponse }}, std::optional<zx::time> deadline{{ end }}
) {
  FIDL_INTERNAL_DISABLE_AUTO_VAR_INIT
  ::fidl::unstable::OwnedEncodedMessage<{{ .WireTransactionalRequest }}, {{ .Transport.Type }}> request_message(
      ::fidl::internal::AllowUnownedInputRef{}, request);
  auto& outgoing = request_message.GetOutgoingMessage();

  {{- if .HasResponse }}
    {{ .IncomingMessageHandleStorageForResponse }} handle_storage;
    ::fidl::unstable::DecodedMessage<{{ .WireTransactionalResponse }}> decoded{
        outgoing.Call(
            client.handle(), handle_storage.view(bytes_.view()),
            deadline.has_value() ? fidl::CallOptions{.deadline = deadline->get()} : fidl::CallOptions{}
        )
    };
    SetStatus(decoded);
    if (ok()) {
      decoded_ = decoded.Take();
    }

    {{- if .HasApplicationError }}
      if (ok()) {
        auto* raw_response = &decoded_.Value()->body;
        if (raw_response->result.is_err()) {
          result_ = fitx::error(raw_response->result.err());
        } else if (raw_response->result.is_response()) {
          result_ = fitx::ok(
            {{- if .Result.ValueParameters -}}
              &(raw_response->result.response())
            {{- end -}}
          );
        }
      }
    {{- end }}
  {{- else }}
    outgoing.Write(client.handle());
    SetStatus(outgoing);
  {{- end }}
}

{{- EndifFuchsia -}}
{{- end }}
