// services/network/public/mojom/proxy_lookup_client.mojom.h is auto generated by mojom_bindings_generator.py, do not edit

// 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 SERVICES_NETWORK_PUBLIC_MOJOM_PROXY_LOOKUP_CLIENT_MOJOM_H_
#define SERVICES_NETWORK_PUBLIC_MOJOM_PROXY_LOOKUP_CLIENT_MOJOM_H_

#include <stdint.h>

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

#include "third_party/abseil-cpp/absl/types/optional.h"
#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 "third_party/perfetto/include/perfetto/tracing/traced_value_forward.h"

#include "services/network/public/mojom/proxy_lookup_client.mojom-shared.h"
#include "services/network/public/mojom/proxy_lookup_client.mojom-forward.h"
#include "url/mojom/url.mojom-forward.h"
#include "services/proxy_resolver/public/mojom/proxy_resolver.mojom.h"
#include <string>
#include <vector>

#include "mojo/public/cpp/bindings/lib/control_message_handler.h"
#include "mojo/public/cpp/bindings/raw_ptr_impl_ref_traits.h"



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


namespace network {
namespace mojom {

class ProxyLookupClientProxy;

template <typename ImplRefTraits>
class ProxyLookupClientStub;

class ProxyLookupClientRequestValidator;


// @generated_from: network.mojom.ProxyLookupClient
class  ProxyLookupClient
    : public ProxyLookupClientInterfaceBase {
 public:
  static const char Name_[];
  static uint32_t MessageToStableIPCHash_(mojo::Message& message);
  static const char* MessageToMethodName_(mojo::Message& message);
  static constexpr uint32_t Version_ = 0;
  static constexpr bool PassesAssociatedKinds_ = false;
  static constexpr bool HasSyncMethods_ = false;
  static constexpr bool HasUninterruptableMethods_ = false;

  using Base_ = ProxyLookupClientInterfaceBase;
  using Proxy_ = ProxyLookupClientProxy;

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

  using RequestValidator_ = ProxyLookupClientRequestValidator;
  using ResponseValidator_ = mojo::PassThroughFilter;
  enum MethodMinVersions : uint32_t {
    kOnProxyLookupCompleteMinVersion = 0,
  };
  virtual ~ProxyLookupClient() = default;

  
// @generated_from: network.mojom.ProxyLookupClient.OnProxyLookupComplete
  virtual void OnProxyLookupComplete(int32_t net_error, const absl::optional<::net::ProxyInfo>& proxy_info) = 0;
};



// @generated_from: network.mojom.ProxyLookupClient
class  ProxyLookupClientProxy
    : public ProxyLookupClient {
 public:
  using InterfaceType = ProxyLookupClient;

  explicit ProxyLookupClientProxy(mojo::MessageReceiverWithResponder* receiver);
  
// @generated_from: network.mojom.ProxyLookupClient.OnProxyLookupComplete
  void OnProxyLookupComplete(int32_t net_error, const absl::optional<::net::ProxyInfo>& proxy_info) final;

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

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

  ProxyLookupClientStub() = default;
  ~ProxyLookupClientStub() override = default;

  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 ProxyLookupClientStubDispatch::Accept(
        ImplRefTraits::GetRawPointer(&sink_), message);
  }

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

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





}  // namespace mojom
}  // namespace network

namespace mojo {

}  // namespace mojo

#endif  // SERVICES_NETWORK_PUBLIC_MOJOM_PROXY_LOOKUP_CLIENT_MOJOM_H_

/* Metadata comment
eyJtZXRhIjogW3siZW5kIjogMTcyNCwgImJlZ2luIjogMTcwNywgImVkZ2UiOiAiJS9reXRoZS9l
ZGdlL2dlbmVyYXRlcyIsICJ0eXBlIjogImFuY2hvcl9kZWZpbmVzIiwgInZuYW1lIjogeyJjb3Jw
dXMiOiAiY2hyb21pdW0uZ29vZ2xlc291cmNlLmNvbS9jaHJvbWl1bS9zcmMiLCAibGFuZ3VhZ2Ui
OiAibW9qb20iLCAic2lnbmF0dXJlIjogIm5ldHdvcmsubW9qb20uUHJveHlMb29rdXBDbGllbnQi
fX0sIHsiZW5kIjogMjY5MCwgImJlZ2luIjogMjY2OSwgImVkZ2UiOiAiJS9reXRoZS9lZGdlL2dl
bmVyYXRlcyIsICJ0eXBlIjogImFuY2hvcl9kZWZpbmVzIiwgInZuYW1lIjogeyJjb3JwdXMiOiAi
Y2hyb21pdW0uZ29vZ2xlc291cmNlLmNvbS9jaHJvbWl1bS9zcmMiLCAibGFuZ3VhZ2UiOiAibW9q
b20iLCAic2lnbmF0dXJlIjogIm5ldHdvcmsubW9qb20uUHJveHlMb29rdXBDbGllbnQuT25Qcm94
eUxvb2t1cENvbXBsZXRlIn19LCB7ImVuZCI6IDMxMjcsICJiZWdpbiI6IDMxMDYsICJlZGdlIjog
IiUva3l0aGUvZWRnZS9nZW5lcmF0ZXMiLCAidHlwZSI6ICJhbmNob3JfZGVmaW5lcyIsICJ2bmFt
ZSI6IHsiY29ycHVzIjogImNocm9taXVtLmdvb2dsZXNvdXJjZS5jb20vY2hyb21pdW0vc3JjIiwg
Imxhbmd1YWdlIjogIm1vam9tIiwgInNpZ25hdHVyZSI6ICJuZXR3b3JrLm1vam9tLlByb3h5TG9v
a3VwQ2xpZW50Lk9uUHJveHlMb29rdXBDb21wbGV0ZSJ9fV0sICJ0eXBlIjogImt5dGhlMCJ9
*/