// mojo/public/mojom/base/safe_base_name.mojom-blink.cc is auto generated by mojom_bindings_generator.py, do not edit

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

#if defined(__clang__)
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunused-private-field"
#endif

#include "mojo/public/mojom/base/safe_base_name.mojom-blink.h"

#include <math.h>
#include <stdint.h>
#include <utility>

#include "base/debug/alias.h"
#include "base/hash/md5_constexpr.h"
#include "base/run_loop.h"
#include "base/strings/string_number_conversions.h"
#include "base/task/thread_pool/thread_pool_instance.h"
#include "base/trace_event/trace_event.h"
#include "base/trace_event/typed_macros.h"
#include "mojo/public/cpp/bindings/features.h"
#include "mojo/public/cpp/bindings/lib/default_construct_tag_internal.h"
#include "mojo/public/cpp/bindings/lib/generated_code_util.h"
#include "mojo/public/cpp/bindings/lib/message_internal.h"
#include "mojo/public/cpp/bindings/lib/proxy_to_responder.h"
#include "mojo/public/cpp/bindings/lib/send_message_helper.h"
#include "mojo/public/cpp/bindings/lib/serialization_util.h"
#include "mojo/public/cpp/bindings/lib/unserialized_message_context.h"
#include "mojo/public/cpp/bindings/lib/validate_params.h"
#include "mojo/public/cpp/bindings/lib/validation_errors.h"
#include "mojo/public/cpp/bindings/mojo_buildflags.h"
#include "mojo/public/cpp/bindings/urgent_message_scope.h"
#include "mojo/public/interfaces/bindings/interface_control_messages.mojom.h"
#include "third_party/perfetto/include/perfetto/tracing/traced_value.h"

#include "mojo/public/mojom/base/safe_base_name.mojom-params-data.h"
#include "mojo/public/mojom/base/safe_base_name.mojom-shared-message-ids.h"

#include "mojo/public/mojom/base/safe_base_name.mojom-blink-import-headers.h"
#include "mojo/public/mojom/base/safe_base_name.mojom-blink-test-utils.h"
#include "mojo/public/cpp/bindings/lib/wtf_serialization.h"


namespace mojo_base::mojom::blink {
SafeBaseName::SafeBaseName()
    : path() {}

SafeBaseName::SafeBaseName(
    const ::base::FilePath& path_in)
    : path(std::move(path_in)) {}

SafeBaseName::~SafeBaseName() = default;

void SafeBaseName::WriteIntoTrace(
    perfetto::TracedValue traced_context) const {
  [[maybe_unused]] auto dict = std::move(traced_context).WriteDictionary();
  perfetto::WriteIntoTracedValueWithFallback(
    dict.AddItem(
      "path"), this->path,
#if BUILDFLAG(MOJO_TRACE_ENABLED)
      "<value of type const ::base::FilePath&>"
#else
      "<value>"
#endif  // BUILDFLAG(MOJO_TRACE_ENABLED)
    );
}

bool SafeBaseName::Validate(
    const void* data,
    mojo::internal::ValidationContext* validation_context) {
  return Data_::Validate(data, validation_context);
}


}  // mojo_base::mojom::blink


namespace mojo {


// static
bool StructTraits<::mojo_base::mojom::blink::SafeBaseName::DataView, ::mojo_base::mojom::blink::SafeBaseNamePtr>::Read(
    ::mojo_base::mojom::blink::SafeBaseName::DataView input,
    ::mojo_base::mojom::blink::SafeBaseNamePtr* output) {
  bool success = true;
  ::mojo_base::mojom::blink::SafeBaseNamePtr result(::mojo_base::mojom::blink::SafeBaseName::New());
  
      if (success && !input.ReadPath(&result->path))
        success = false;
  *output = std::move(result);
  return success;
}

}  // namespace mojo


// Symbols declared in the -test-utils.h header are defined here instead of a
// separate .cc file to save compile time.


namespace mojo_base::mojom::blink {




}  // mojo_base::mojom::blink


#if defined(__clang__)
#pragma clang diagnostic pop
#endif