0
Files
src/tools/json_schema_compiler/util.cc
Claudio DeSouza 2ab51b0268 [json-schema-compiler] Passing error param by reference
This CL updates the signature of the methods generated by the compiler
to pass error out params around as a reference.

When it comes to FromValueDeprecated, a temporary provision has been
made so the deprecated method keeps its original signature using a
pointer, until all deprecated call sites are updated.

A subsequent CL is correcting the callers themselves to avoid the risk
of nullptr dereferences in some of the place where we are converting a
pointer to a reference.

Bug: 1415155
Change-Id: I3651e675ae16a6df2ab62a35cb0a2811b4ba80c7
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4243359
Commit-Queue: Claudio DeSouza <cdesouza@igalia.com>
Reviewed-by: David Bertoni <dbertoni@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1121762}
2023-03-24 17:16:34 +00:00

149 lines
3.5 KiB
C++

// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "tools/json_schema_compiler/util.h"
#include "base/strings/stringprintf.h"
#include "base/strings/utf_string_conversions.h"
#include "base/values.h"
namespace json_schema_compiler {
namespace util {
namespace {
bool ReportError(const base::Value& from,
base::Value::Type expected,
std::u16string& error) {
DCHECK(error.empty());
error = base::ASCIIToUTF16(base::StringPrintf(
"expected %s, got %s", base::Value::GetTypeName(expected),
base::Value::GetTypeName(from.type())));
return false; // Always false on purpose.
}
} // namespace
bool PopulateItem(const base::Value& from, int& out) {
if (!from.is_int()) {
return false;
}
out = from.GetInt();
return true;
}
bool PopulateItem(const base::Value& from, int& out, std::u16string& error) {
if (!PopulateItem(from, out))
return ReportError(from, base::Value::Type::INTEGER, error);
return true;
}
bool PopulateItem(const base::Value& from, bool& out) {
if (!from.is_bool()) {
return false;
}
out = from.GetBool();
return true;
}
bool PopulateItem(const base::Value& from, bool& out, std::u16string& error) {
if (!from.is_bool()) {
return ReportError(from, base::Value::Type::BOOLEAN, error);
}
out = from.GetBool();
return true;
}
bool PopulateItem(const base::Value& from, double& out) {
if (!from.is_double()) {
return false;
}
out = from.GetDouble();
return true;
}
bool PopulateItem(const base::Value& from, double& out, std::u16string& error) {
if (!from.is_double()) {
return ReportError(from, base::Value::Type::DOUBLE, error);
}
out = from.GetDouble();
return true;
}
bool PopulateItem(const base::Value& from, std::string& out) {
if (!from.is_string())
return false;
out = from.GetString();
return true;
}
bool PopulateItem(const base::Value& from,
std::string& out,
std::u16string& error) {
if (!from.is_string()) {
return ReportError(from, base::Value::Type::STRING, error);
}
out = from.GetString();
return true;
}
bool PopulateItem(const base::Value& from, std::vector<uint8_t>& out) {
if (!from.is_blob()) {
return false;
}
out = from.GetBlob();
return true;
}
bool PopulateItem(const base::Value& from,
std::vector<uint8_t>& out,
std::u16string& error) {
if (!from.is_blob()) {
return ReportError(from, base::Value::Type::BINARY, error);
}
out = from.GetBlob();
return true;
}
bool PopulateItem(const base::Value& from, base::Value& out) {
out = from.Clone();
return true;
}
bool PopulateItem(const base::Value& from,
base::Value& out,
std::u16string& error) {
out = from.Clone();
return true;
}
void AddItemToList(const int from, base::Value::List& out) {
out.Append(from);
}
void AddItemToList(const bool from, base::Value::List& out) {
out.Append(from);
}
void AddItemToList(const double from, base::Value::List& out) {
out.Append(from);
}
void AddItemToList(const std::string& from, base::Value::List& out) {
out.Append(from);
}
void AddItemToList(const std::vector<uint8_t>& from, base::Value::List& out) {
out.Append(base::Value(from));
}
void AddItemToList(const base::Value& from, base::Value::List& out) {
out.Append(from.Clone());
}
} // namespace util
} // namespace json_schema_compiler