// 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.

#include <lib/ui/scenic/cpp/view_token_pair.h>
#include <zircon/assert.h>

namespace scenic {

ViewTokenPair ViewTokenPair::New() {
  ViewTokenPair token_pair;

  auto status =
      zx::eventpair::create(0u, &token_pair.view_token.value, &token_pair.view_holder_token.value);
  // Assert even in non-debug builds, because eventpair creation can fail under
  // normal operation.  Failure can occur for example, if the job creation
  // policy governing this process forbids eventpair creation.
  //
  // It is unlikely that a well-behaved Scenic client would crash here; if you
  // hit this, it means something is very abnormal.
  ZX_ASSERT(status == ZX_OK);

  return token_pair;
}

ViewTokenStdPair NewViewTokenPair() {
  auto token_pair = ViewTokenPair::New();

  return ViewTokenStdPair(std::move(token_pair.view_token),
                          std::move(token_pair.view_holder_token));
}

fuchsia::ui::views::ViewToken ToViewToken(zx::eventpair raw_token) {
  return fuchsia::ui::views::ViewToken({
      .value = std::move(raw_token),
  });
}

fuchsia::ui::views::ViewHolderToken ToViewHolderToken(zx::eventpair raw_token) {
  return fuchsia::ui::views::ViewHolderToken({
      .value = std::move(raw_token),
  });
}

}  // namespace scenic
