AK: Provide a few mutable JSON object/array accessors

We have mutable accessors on the JsonValue class already. This will be
needed for interaction with Firefox's DevTools, where we will want to
mutate the serialized DOM tree we receive from WebContent.
This commit is contained in:
Timothy Flynn 2025-02-14 18:13:40 -05:00 committed by Tim Flynn
commit 0fc1d4cd69
Notes: github-actions[bot] 2025-02-19 13:47:48 +00:00
3 changed files with 44 additions and 0 deletions

View file

@ -80,6 +80,13 @@ public:
[[nodiscard]] ByteString to_byte_string() const { return serialized<StringBuilder>(); } [[nodiscard]] ByteString to_byte_string() const { return serialized<StringBuilder>(); }
template<typename Callback>
void for_each(Callback callback)
{
for (auto& value : m_values)
callback(value);
}
template<typename Callback> template<typename Callback>
void for_each(Callback callback) const void for_each(Callback callback) const
{ {
@ -87,6 +94,14 @@ public:
callback(value); callback(value);
} }
template<FallibleFunction<JsonValue&> Callback>
ErrorOr<void, CallbackErrorType<Callback>> try_for_each(Callback&& callback)
{
for (auto& value : m_values)
TRY(callback(value));
return {};
}
template<FallibleFunction<JsonValue const&> Callback> template<FallibleFunction<JsonValue const&> Callback>
ErrorOr<void, CallbackErrorType<Callback>> try_for_each(Callback&& callback) const ErrorOr<void, CallbackErrorType<Callback>> try_for_each(Callback&& callback) const
{ {
@ -95,6 +110,7 @@ public:
return {}; return {};
} }
[[nodiscard]] Vector<JsonValue>& values() { return m_values; }
[[nodiscard]] Vector<JsonValue> const& values() const { return m_values; } [[nodiscard]] Vector<JsonValue> const& values() const { return m_values; }
void ensure_capacity(size_t capacity) { m_values.ensure_capacity(capacity); } void ensure_capacity(size_t capacity) { m_values.ensure_capacity(capacity); }

View file

@ -47,6 +47,14 @@ bool JsonObject::is_empty() const
return m_members.is_empty(); return m_members.is_empty();
} }
Optional<JsonValue&> JsonObject::get(StringView key)
{
auto it = m_members.find(key);
if (it == m_members.end())
return {};
return it->value;
}
Optional<JsonValue const&> JsonObject::get(StringView key) const Optional<JsonValue const&> JsonObject::get(StringView key) const
{ {
auto it = m_members.find(key); auto it = m_members.find(key);
@ -116,6 +124,14 @@ Optional<ByteString> JsonObject::get_byte_string(StringView key) const
return {}; return {};
} }
Optional<JsonObject&> JsonObject::get_object(StringView key)
{
auto maybe_value = get(key);
if (maybe_value.has_value() && maybe_value->is_object())
return maybe_value->as_object();
return {};
}
Optional<JsonObject const&> JsonObject::get_object(StringView key) const Optional<JsonObject const&> JsonObject::get_object(StringView key) const
{ {
auto maybe_value = get(key); auto maybe_value = get(key);
@ -124,6 +140,14 @@ Optional<JsonObject const&> JsonObject::get_object(StringView key) const
return {}; return {};
} }
Optional<JsonArray&> JsonObject::get_array(StringView key)
{
auto maybe_value = get(key);
if (maybe_value.has_value() && maybe_value->is_array())
return maybe_value->as_array();
return {};
}
Optional<JsonArray const&> JsonObject::get_array(StringView key) const Optional<JsonArray const&> JsonObject::get_array(StringView key) const
{ {
auto maybe_value = get(key); auto maybe_value = get(key);

View file

@ -52,6 +52,7 @@ public:
[[nodiscard]] bool has_array(StringView key) const; [[nodiscard]] bool has_array(StringView key) const;
[[nodiscard]] bool has_object(StringView key) const; [[nodiscard]] bool has_object(StringView key) const;
Optional<JsonValue&> get(StringView key);
Optional<JsonValue const&> get(StringView key) const; Optional<JsonValue const&> get(StringView key) const;
template<Integral T> template<Integral T>
@ -76,7 +77,10 @@ public:
Optional<ByteString> get_byte_string(StringView key) const; Optional<ByteString> get_byte_string(StringView key) const;
Optional<JsonObject&> get_object(StringView key);
Optional<JsonObject const&> get_object(StringView key) const; Optional<JsonObject const&> get_object(StringView key) const;
Optional<JsonArray&> get_array(StringView key);
Optional<JsonArray const&> get_array(StringView key) const; Optional<JsonArray const&> get_array(StringView key) const;
Optional<double> get_double_with_precision_loss(StringView key) const; Optional<double> get_double_with_precision_loss(StringView key) const;