// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef COMPONENTS_RAPPOR_PUBLIC_INTERFACES_RAPPOR_RECORDER_MOJOM_BLINK_H_
#define COMPONENTS_RAPPOR_PUBLIC_INTERFACES_RAPPOR_RECORDER_MOJOM_BLINK_H_

#include <stdint.h>

#include <limits>
#include <type_traits>
#include <utility>

#include "base/callback.h"
#include "base/macros.h"
#include "base/optional.h"

#include "mojo/public/cpp/bindings/mojo_buildflags.h"
#if BUILDFLAG(MOJO_TRACE_ENABLED)
#include "base/trace_event/trace_event.h"
#endif
#include "mojo/public/cpp/bindings/clone_traits.h"
#include "mojo/public/cpp/bindings/equals_traits.h"
#include "mojo/public/cpp/bindings/lib/serialization.h"
#include "mojo/public/cpp/bindings/struct_ptr.h"
#include "mojo/public/cpp/bindings/struct_traits.h"
#include "mojo/public/cpp/bindings/union_traits.h"
#include "components/rappor/public/interfaces/rappor_recorder.mojom-shared.h"
#include "components/rappor/public/interfaces/rappor_recorder.mojom-blink-forward.h"
#include "url/mojom/url.mojom-blink-forward.h"

#include "mojo/public/cpp/bindings/lib/wtf_clone_equals_util.h"
#include "mojo/public/cpp/bindings/lib/wtf_hash_util.h"
#include "third_party/blink/renderer/platform/wtf/hash_functions.h"
#include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"

#include "mojo/public/cpp/bindings/associated_interface_ptr.h"
#include "mojo/public/cpp/bindings/associated_interface_ptr_info.h"
#include "mojo/public/cpp/bindings/associated_interface_request.h"
#include "mojo/public/cpp/bindings/interface_ptr.h"
#include "mojo/public/cpp/bindings/interface_request.h"
#include "mojo/public/cpp/bindings/lib/control_message_handler.h"
#include "mojo/public/cpp/bindings/raw_ptr_impl_ref_traits.h"
#include "mojo/public/cpp/bindings/thread_safe_interface_ptr.h"


#include "mojo/public/cpp/bindings/lib/native_enum_serialization.h"
#include "mojo/public/cpp/bindings/lib/native_struct_serialization.h"

#ifdef KYTHE_IS_RUNNING
#pragma kythe_inline_metadata "Metadata comment"
#endif


namespace rappor {
namespace mojom {
namespace blink {

class RapporRecorderProxy;

template <typename ImplRefTraits>
class RapporRecorderStub;

class RapporRecorderRequestValidator;


// @generated_from: rappor.mojom.RapporRecorder
class  RapporRecorder
    : public RapporRecorderInterfaceBase {
 public:
  static const char Name_[];
  static constexpr uint32_t Version_ = 0;
  static constexpr bool PassesAssociatedKinds_ = false;
  static constexpr bool HasSyncMethods_ = false;

  using Base_ = RapporRecorderInterfaceBase;
  using Proxy_ = RapporRecorderProxy;

  template <typename ImplRefTraits>
  using Stub_ = RapporRecorderStub<ImplRefTraits>;

  using RequestValidator_ = RapporRecorderRequestValidator;
  using ResponseValidator_ = mojo::PassThroughFilter;
  enum MethodMinVersions : uint32_t {
    kRecordRapporMinVersion = 0,
    kRecordRapporURLMinVersion = 0,
  };
  virtual ~RapporRecorder() {}

  
// @generated_from: rappor.mojom.RapporRecorder.RecordRappor
  virtual void RecordRappor(const WTF::String& metric, const WTF::String& sample) = 0;

  
// @generated_from: rappor.mojom.RapporRecorder.RecordRapporURL
  virtual void RecordRapporURL(const WTF::String& metric, const ::blink::KURL& url) = 0;
};

class  RapporRecorderProxy
    : public RapporRecorder {
 public:
  using InterfaceType = RapporRecorder;

  explicit RapporRecorderProxy(mojo::MessageReceiverWithResponder* receiver);
  void RecordRappor(const WTF::String& metric, const WTF::String& sample) final;
  void RecordRapporURL(const WTF::String& metric, const ::blink::KURL& url) final;

 private:
  mojo::MessageReceiverWithResponder* receiver_;
};
class  RapporRecorderStubDispatch {
 public:
  static bool Accept(RapporRecorder* impl, mojo::Message* message);
  static bool AcceptWithResponder(
      RapporRecorder* impl,
      mojo::Message* message,
      std::unique_ptr<mojo::MessageReceiverWithStatus> responder);
};

template <typename ImplRefTraits =
              mojo::RawPtrImplRefTraits<RapporRecorder>>
class RapporRecorderStub
    : public mojo::MessageReceiverWithResponderStatus {
 public:
  using ImplPointerType = typename ImplRefTraits::PointerType;

  RapporRecorderStub() {}
  ~RapporRecorderStub() override {}

  void set_sink(ImplPointerType sink) { sink_ = std::move(sink); }
  ImplPointerType& sink() { return sink_; }

  bool Accept(mojo::Message* message) override {
    if (ImplRefTraits::IsNull(sink_))
      return false;
    return RapporRecorderStubDispatch::Accept(
        ImplRefTraits::GetRawPointer(&sink_), message);
  }

  bool AcceptWithResponder(
      mojo::Message* message,
      std::unique_ptr<mojo::MessageReceiverWithStatus> responder) override {
    if (ImplRefTraits::IsNull(sink_))
      return false;
    return RapporRecorderStubDispatch::AcceptWithResponder(
        ImplRefTraits::GetRawPointer(&sink_), message, std::move(responder));
  }

 private:
  ImplPointerType sink_;
};
class  RapporRecorderRequestValidator : public mojo::MessageReceiver {
 public:
  bool Accept(mojo::Message* message) override;
};





}  // namespace blink
}  // namespace mojom
}  // namespace rappor

namespace mojo {

}  // namespace mojo

#endif  // COMPONENTS_RAPPOR_PUBLIC_INTERFACES_RAPPOR_RECORDER_MOJOM_BLINK_H_
/* Metadata comment
eyJtZXRhIjogW3siZW5kIjogMjM3MSwgImJlZ2luIjogMjM1NywgImVkZ2UiOiAiJS9reXRoZS9l
ZGdlL2dlbmVyYXRlcyIsICJ0eXBlIjogImFuY2hvcl9kZWZpbmVzIiwgInZuYW1lIjogeyJjb3Jw
dXMiOiAiY2hyb21pdW0uZ29vZ2xlc291cmNlLmNvbS9jaHJvbWl1bS9zcmMiLCAibGFuZ3VhZ2Ui
OiAibW9qb20iLCAic2lnbmF0dXJlIjogInJhcHBvci5tb2pvbS5SYXBwb3JSZWNvcmRlciJ9fSwg
eyJlbmQiOiAzMTIyLCAiYmVnaW4iOiAzMTEwLCAiZWRnZSI6ICIlL2t5dGhlL2VkZ2UvZ2VuZXJh
dGVzIiwgInR5cGUiOiAiYW5jaG9yX2RlZmluZXMiLCAidm5hbWUiOiB7ImNvcnB1cyI6ICJjaHJv
bWl1bS5nb29nbGVzb3VyY2UuY29tL2Nocm9taXVtL3NyYyIsICJsYW5ndWFnZSI6ICJtb2pvbSIs
ICJzaWduYXR1cmUiOiAicmFwcG9yLm1vam9tLlJhcHBvclJlY29yZGVyLlJlY29yZFJhcHBvciJ9
fSwgeyJlbmQiOiAzMjgwLCAiYmVnaW4iOiAzMjY1LCAiZWRnZSI6ICIlL2t5dGhlL2VkZ2UvZ2Vu
ZXJhdGVzIiwgInR5cGUiOiAiYW5jaG9yX2RlZmluZXMiLCAidm5hbWUiOiB7ImNvcnB1cyI6ICJj
aHJvbWl1bS5nb29nbGVzb3VyY2UuY29tL2Nocm9taXVtL3NyYyIsICJsYW5ndWFnZSI6ICJtb2pv
bSIsICJzaWduYXR1cmUiOiAicmFwcG9yLm1vam9tLlJhcHBvclJlY29yZGVyLlJlY29yZFJhcHBv
clVSTCJ9fV0sICJ0eXBlIjogImt5dGhlMCJ9
*/