// Copyright 2023 The Pigweed Authors
//
// Licensed under the Apache License, Version 2.0 (the "License"); you may not
// use this file except in compliance with the License. You may obtain a copy of
// the License at
//
//     https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
// License for the specific language governing permissions and limitations under
// the License.

#include "pw_async_bench/callback_impl.h"

namespace pw::async_bench {

pw::Status ProxyEchoImpl::Echo(EchoRequest request, EchoResponder responder) {
  // NOTE: this requires that `pw::Function` can capture the full `responder`
  // object as well as any associated state (including possibly `this`)
  // required for further steps. This also doesn't give us a way to cancel the
  // ongoing request if something in `ProxyEchoImpl` goes down.
  //
  // We're also assuming here that each `Echo` call stores some state in the
  // RPC system in order to track the ongoing call and the `pw::Function` we
  // gave it.

  // We have to allocate because `responder` doesn't fit in pw::Function.
  auto responder_alloc = std::make_unique<EchoResponder>(std::move(responder));
  pw::Status status = remote_->Echo(
      std::move(request),
      [responder_alloc = std::move(responder_alloc)](
          pw::Result<EchoResponse> response) mutable -> void {
        // Ignore the result of the send.
        //
        // This, too, requires that the RPC system allocates storage for the
        // ongoing call and advances it. We also don't (naiively) have a way
        // to cancel the call without some kind of handle.
        responder_alloc->Send(std::move(response), [](pw::Status) {})
            .IgnoreError();
      });
  if (status.ok()) {
    // WHat would we do here? We can't use `responder` if it has already been
    // moved into the callback above-- this stinks :(
    // responder.Send(std::move(status), [](pw::Status) {}).IgnoreError();
  }
  return pw::OkStatus();
}

}  // namespace pw::async_bench
