1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 11:18:11 +00:00

AK: Make JSON parser return ErrorOr<JsonValue> (instead of Optional)

Also add slightly richer parse errors now that we can include a string
literal with returned errors.

This will allow us to use TRY() when working with JSON data.
This commit is contained in:
Andreas Kling 2021-11-15 01:46:51 +01:00
parent 304c03f457
commit 587f9af960
54 changed files with 172 additions and 228 deletions

View file

@ -16,10 +16,10 @@ constexpr bool is_space(int ch)
return ch == '\t' || ch == '\n' || ch == '\r' || ch == ' '; return ch == '\t' || ch == '\n' || ch == '\r' || ch == ' ';
} }
String JsonParser::consume_and_unescape_string() ErrorOr<String> JsonParser::consume_and_unescape_string()
{ {
if (!consume_specific('"')) if (!consume_specific('"'))
return {}; return Error::from_string_literal("JsonParser: Expected '\"'"sv);
StringBuilder final_sb; StringBuilder final_sb;
for (;;) { for (;;) {
@ -32,7 +32,7 @@ String JsonParser::consume_and_unescape_string()
if (ch == '"' || ch == '\\') if (ch == '"' || ch == '\\')
break; break;
if (is_ascii_c0_control(ch)) if (is_ascii_c0_control(ch))
return {}; return Error::from_string_literal("JsonParser: Error while parsing string"sv);
++peek_index; ++peek_index;
} }
@ -101,97 +101,90 @@ String JsonParser::consume_and_unescape_string()
if (next_is('u')) { if (next_is('u')) {
ignore(); ignore();
if (tell_remaining() < 4) if (tell_remaining() < 4)
return {}; return Error::from_string_literal("JsonParser: EOF while parsing Unicode escape"sv);
auto code_point = AK::StringUtils::convert_to_uint_from_hex(consume(4)); auto code_point = AK::StringUtils::convert_to_uint_from_hex(consume(4));
if (code_point.has_value()) { if (code_point.has_value()) {
final_sb.append_code_point(code_point.value()); final_sb.append_code_point(code_point.value());
continue; continue;
} else {
return {};
} }
return Error::from_string_literal("JsonParser: Error while parsing Unicode escape"sv);
} }
return {}; return Error::from_string_literal("JsonParser: Error while parsing string"sv);
} }
if (!consume_specific('"')) if (!consume_specific('"'))
return {}; return Error::from_string_literal("JsonParser: Expected '\"'"sv);
return final_sb.to_string(); return final_sb.to_string();
} }
Optional<JsonValue> JsonParser::parse_object() ErrorOr<JsonValue> JsonParser::parse_object()
{ {
JsonObject object; JsonObject object;
if (!consume_specific('{')) if (!consume_specific('{'))
return {}; return Error::from_string_literal("JsonParser: Expected '{'"sv);
for (;;) { for (;;) {
ignore_while(is_space); ignore_while(is_space);
if (peek() == '}') if (peek() == '}')
break; break;
ignore_while(is_space); ignore_while(is_space);
auto name = consume_and_unescape_string(); auto name = TRY(consume_and_unescape_string());
if (name.is_null()) if (name.is_null())
return {}; return Error::from_string_literal("JsonParser: Expected object property name"sv);
ignore_while(is_space); ignore_while(is_space);
if (!consume_specific(':')) if (!consume_specific(':'))
return {}; return Error::from_string_literal("JsonParser: Expected ':'"sv);
ignore_while(is_space); ignore_while(is_space);
auto value = parse_helper(); auto value = TRY(parse_helper());
if (!value.has_value()) object.set(name, move(value));
return {};
object.set(name, value.release_value());
ignore_while(is_space); ignore_while(is_space);
if (peek() == '}') if (peek() == '}')
break; break;
if (!consume_specific(',')) if (!consume_specific(','))
return {}; return Error::from_string_literal("JsonParser: Expected ','"sv);
ignore_while(is_space); ignore_while(is_space);
if (peek() == '}') if (peek() == '}')
return {}; return Error::from_string_literal("JsonParser: Unexpected '}'"sv);
} }
if (!consume_specific('}')) if (!consume_specific('}'))
return {}; return Error::from_string_literal("JsonParser: Expected '}'"sv);
return JsonValue { move(object) }; return JsonValue { move(object) };
} }
Optional<JsonValue> JsonParser::parse_array() ErrorOr<JsonValue> JsonParser::parse_array()
{ {
JsonArray array; JsonArray array;
if (!consume_specific('[')) if (!consume_specific('['))
return {}; return Error::from_string_literal("JsonParser: Expected '['"sv);
for (;;) { for (;;) {
ignore_while(is_space); ignore_while(is_space);
if (peek() == ']') if (peek() == ']')
break; break;
auto element = parse_helper(); auto element = TRY(parse_helper());
if (!element.has_value()) array.append(move(element));
return {};
array.append(element.release_value());
ignore_while(is_space); ignore_while(is_space);
if (peek() == ']') if (peek() == ']')
break; break;
if (!consume_specific(',')) if (!consume_specific(','))
return {}; return Error::from_string_literal("JsonParser: Expected ','"sv);
ignore_while(is_space); ignore_while(is_space);
if (peek() == ']') if (peek() == ']')
return {}; return Error::from_string_literal("JsonParser: Unexpected ']'"sv);
} }
ignore_while(is_space); ignore_while(is_space);
if (!consume_specific(']')) if (!consume_specific(']'))
return {}; return Error::from_string_literal("JsonParser: Expected ']'"sv);
return JsonValue { move(array) }; return JsonValue { move(array) };
} }
Optional<JsonValue> JsonParser::parse_string() ErrorOr<JsonValue> JsonParser::parse_string()
{ {
auto result = consume_and_unescape_string(); auto string = TRY(consume_and_unescape_string());
if (result.is_null()) return JsonValue(move(string));
return {};
return JsonValue(result);
} }
Optional<JsonValue> JsonParser::parse_number() ErrorOr<JsonValue> JsonParser::parse_number()
{ {
JsonValue value; JsonValue value;
Vector<char, 128> number_buffer; Vector<char, 128> number_buffer;
@ -202,7 +195,7 @@ Optional<JsonValue> JsonParser::parse_number()
char ch = peek(); char ch = peek();
if (ch == '.') { if (ch == '.') {
if (is_double) if (is_double)
return {}; return Error::from_string_literal("JsonParser: Multiple '.' in number"sv);
is_double = true; is_double = true;
++m_index; ++m_index;
@ -211,18 +204,18 @@ Optional<JsonValue> JsonParser::parse_number()
if (ch == '-' || (ch >= '0' && ch <= '9')) { if (ch == '-' || (ch >= '0' && ch <= '9')) {
if (is_double) { if (is_double) {
if (ch == '-') if (ch == '-')
return {}; return Error::from_string_literal("JsonParser: Error while parsing number"sv);
fraction_buffer.append(ch); fraction_buffer.append(ch);
} else { } else {
if (number_buffer.size() > 0) { if (number_buffer.size() > 0) {
if (number_buffer.at(0) == '0') if (number_buffer.at(0) == '0')
return {}; return Error::from_string_literal("JsonParser: Error while parsing number"sv);
} }
if (number_buffer.size() > 1) { if (number_buffer.size() > 1) {
if (number_buffer.at(0) == '-' && number_buffer.at(1) == '0') if (number_buffer.at(0) == '-' && number_buffer.at(1) == '0')
return {}; return Error::from_string_literal("JsonParser: Error while parsing number"sv);
} }
number_buffer.append(ch); number_buffer.append(ch);
@ -245,14 +238,14 @@ Optional<JsonValue> JsonParser::parse_number()
} else { } else {
auto number = number_string.to_int(); auto number = number_string.to_int();
if (!number.has_value()) if (!number.has_value())
return {}; return Error::from_string_literal("JsonParser: Error while parsing number"sv);
whole = number.value(); whole = number.value();
} }
StringView fraction_string(fraction_buffer.data(), fraction_buffer.size()); StringView fraction_string(fraction_buffer.data(), fraction_buffer.size());
auto fraction_string_uint = fraction_string.to_uint(); auto fraction_string_uint = fraction_string.to_uint();
if (!fraction_string_uint.has_value()) if (!fraction_string_uint.has_value())
return {}; return Error::from_string_literal("JsonParser: Error while parsing number"sv);
int fraction = fraction_string_uint.value(); int fraction = fraction_string_uint.value();
fraction *= (whole < 0) ? -1 : 1; fraction *= (whole < 0) ? -1 : 1;
@ -273,7 +266,7 @@ Optional<JsonValue> JsonParser::parse_number()
} else { } else {
auto number = number_string.to_int<i64>(); auto number = number_string.to_int<i64>();
if (!number.has_value()) if (!number.has_value())
return {}; return Error::from_string_literal("JsonParser: Error while parsing number"sv);
if (number.value() <= NumericLimits<i32>::max()) { if (number.value() <= NumericLimits<i32>::max()) {
value = JsonValue((i32)number.value()); value = JsonValue((i32)number.value());
} else { } else {
@ -287,28 +280,28 @@ Optional<JsonValue> JsonParser::parse_number()
return value; return value;
} }
Optional<JsonValue> JsonParser::parse_true() ErrorOr<JsonValue> JsonParser::parse_true()
{ {
if (!consume_specific("true")) if (!consume_specific("true"))
return {}; return Error::from_string_literal("JsonParser: Expected 'true'"sv);
return JsonValue(true); return JsonValue(true);
} }
Optional<JsonValue> JsonParser::parse_false() ErrorOr<JsonValue> JsonParser::parse_false()
{ {
if (!consume_specific("false")) if (!consume_specific("false"))
return {}; return Error::from_string_literal("JsonParser: Expected 'false'"sv);
return JsonValue(false); return JsonValue(false);
} }
Optional<JsonValue> JsonParser::parse_null() ErrorOr<JsonValue> JsonParser::parse_null()
{ {
if (!consume_specific("null")) if (!consume_specific("null"))
return {}; return Error::from_string_literal("JsonParser: Expected 'null'"sv);
return JsonValue(JsonValue::Type::Null); return JsonValue(JsonValue::Type::Null);
} }
Optional<JsonValue> JsonParser::parse_helper() ErrorOr<JsonValue> JsonParser::parse_helper()
{ {
ignore_while(is_space); ignore_while(is_space);
auto type_hint = peek(); auto type_hint = peek();
@ -339,17 +332,15 @@ Optional<JsonValue> JsonParser::parse_helper()
return parse_null(); return parse_null();
} }
return {}; return Error::from_string_literal("JsonParser: Unexpected character"sv);
} }
Optional<JsonValue> JsonParser::parse() ErrorOr<JsonValue> JsonParser::parse()
{ {
auto result = parse_helper(); auto result = TRY(parse_helper());
if (!result.has_value())
return {};
ignore_while(is_space); ignore_while(is_space);
if (!is_eof()) if (!is_eof())
return {}; return Error::from_string_literal("JsonParser: Didn't consume all input"sv);
return result; return result;
} }

View file

@ -18,19 +18,19 @@ public:
{ {
} }
Optional<JsonValue> parse(); ErrorOr<JsonValue> parse();
private: private:
Optional<JsonValue> parse_helper(); ErrorOr<JsonValue> parse_helper();
String consume_and_unescape_string(); ErrorOr<String> consume_and_unescape_string();
Optional<JsonValue> parse_array(); ErrorOr<JsonValue> parse_array();
Optional<JsonValue> parse_object(); ErrorOr<JsonValue> parse_object();
Optional<JsonValue> parse_number(); ErrorOr<JsonValue> parse_number();
Optional<JsonValue> parse_string(); ErrorOr<JsonValue> parse_string();
Optional<JsonValue> parse_false(); ErrorOr<JsonValue> parse_false();
Optional<JsonValue> parse_true(); ErrorOr<JsonValue> parse_true();
Optional<JsonValue> parse_null(); ErrorOr<JsonValue> parse_null();
String m_last_string_starting_with_character[256]; String m_last_string_starting_with_character[256];
}; };

View file

@ -228,7 +228,7 @@ void JsonValue::clear()
} }
#ifndef KERNEL #ifndef KERNEL
Optional<JsonValue> JsonValue::from_string(StringView input) ErrorOr<JsonValue> JsonValue::from_string(StringView input)
{ {
return JsonParser(input).parse(); return JsonParser(input).parse();
} }

View file

@ -30,7 +30,7 @@ public:
Object, Object,
}; };
static Optional<JsonValue> from_string(StringView); static ErrorOr<JsonValue> from_string(StringView);
explicit JsonValue(Type = Type::Null); explicit JsonValue(Type = Type::Null);
~JsonValue() { clear(); } ~JsonValue() { clear(); }

View file

@ -10,9 +10,8 @@
int main(int, char**) int main(int, char**)
{ {
auto value = JsonValue::from_string("{\"property\": \"value\"}"); auto value = JsonValue::from_string("{\"property\": \"value\"}").release_value_but_fixme_should_propagate_errors();
VERIFY(value.has_value()); printf("parsed: _%s_\n", value.to_string().characters());
printf("parsed: _%s_\n", value.value().to_string().characters()); printf("object.property = '%s'\n", value.as_object().get("property").to_string().characters());
printf("object.property = '%s'\n", value.value().as_object().get("property").to_string().characters());
return 0; return 0;
} }

View file

@ -96,10 +96,9 @@ static void parse_core_aliases(String core_supplemental_path, UnicodeLocaleData&
auto core_aliases_file_or_error = Core::File::open(core_aliases_path.string(), Core::OpenMode::ReadOnly); auto core_aliases_file_or_error = Core::File::open(core_aliases_path.string(), Core::OpenMode::ReadOnly);
VERIFY(!core_aliases_file_or_error.is_error()); VERIFY(!core_aliases_file_or_error.is_error());
auto core_aliases = JsonParser(core_aliases_file_or_error.value()->read_all()).parse(); auto core_aliases = JsonValue::from_string(core_aliases_file_or_error.value()->read_all()).release_value_but_fixme_should_propagate_errors();
VERIFY(core_aliases.has_value());
auto const& supplemental_object = core_aliases->as_object().get("supplemental"sv); auto const& supplemental_object = core_aliases.as_object().get("supplemental"sv);
auto const& metadata_object = supplemental_object.as_object().get("metadata"sv); auto const& metadata_object = supplemental_object.as_object().get("metadata"sv);
auto const& alias_object = metadata_object.as_object().get("alias"sv); auto const& alias_object = metadata_object.as_object().get("alias"sv);
@ -137,10 +136,9 @@ static void parse_likely_subtags(String core_supplemental_path, UnicodeLocaleDat
auto likely_subtags_file_or_error = Core::File::open(likely_subtags_path.string(), Core::OpenMode::ReadOnly); auto likely_subtags_file_or_error = Core::File::open(likely_subtags_path.string(), Core::OpenMode::ReadOnly);
VERIFY(!likely_subtags_file_or_error.is_error()); VERIFY(!likely_subtags_file_or_error.is_error());
auto likely_subtags = JsonParser(likely_subtags_file_or_error.value()->read_all()).parse(); auto likely_subtags = JsonValue::from_string(likely_subtags_file_or_error.value()->read_all()).release_value_but_fixme_should_propagate_errors();
VERIFY(likely_subtags.has_value());
auto const& supplemental_object = likely_subtags->as_object().get("supplemental"sv); auto const& supplemental_object = likely_subtags.as_object().get("supplemental"sv);
auto const& likely_subtags_object = supplemental_object.as_object().get("likelySubtags"sv); auto const& likely_subtags_object = supplemental_object.as_object().get("likelySubtags"sv);
likely_subtags_object.as_object().for_each_member([&](auto const& key, JsonValue const& value) { likely_subtags_object.as_object().for_each_member([&](auto const& key, JsonValue const& value) {
@ -163,10 +161,9 @@ static void parse_identity(String locale_path, UnicodeLocaleData& locale_data, L
auto languages_file_or_error = Core::File::open(languages_path.string(), Core::OpenMode::ReadOnly); auto languages_file_or_error = Core::File::open(languages_path.string(), Core::OpenMode::ReadOnly);
VERIFY(!languages_file_or_error.is_error()); VERIFY(!languages_file_or_error.is_error());
auto languages = JsonParser(languages_file_or_error.value()->read_all()).parse(); auto languages = JsonValue::from_string(languages_file_or_error.value()->read_all()).release_value_but_fixme_should_propagate_errors();
VERIFY(languages.has_value());
auto const& main_object = languages->as_object().get("main"sv); auto const& main_object = languages.as_object().get("main"sv);
auto const& locale_object = main_object.as_object().get(languages_path.parent().basename()); auto const& locale_object = main_object.as_object().get(languages_path.parent().basename());
auto const& identity_object = locale_object.as_object().get("identity"sv); auto const& identity_object = locale_object.as_object().get("identity"sv);
auto const& language_string = identity_object.as_object().get("language"sv); auto const& language_string = identity_object.as_object().get("language"sv);
@ -199,10 +196,9 @@ static void parse_locale_languages(String locale_path, UnicodeLocaleData& locale
auto languages_file_or_error = Core::File::open(languages_path.string(), Core::OpenMode::ReadOnly); auto languages_file_or_error = Core::File::open(languages_path.string(), Core::OpenMode::ReadOnly);
VERIFY(!languages_file_or_error.is_error()); VERIFY(!languages_file_or_error.is_error());
auto languages = JsonParser(languages_file_or_error.value()->read_all()).parse(); auto languages = JsonValue::from_string(languages_file_or_error.value()->read_all()).release_value_but_fixme_should_propagate_errors();
VERIFY(languages.has_value());
auto const& main_object = languages->as_object().get("main"sv); auto const& main_object = languages.as_object().get("main"sv);
auto const& locale_object = main_object.as_object().get(languages_path.parent().basename()); auto const& locale_object = main_object.as_object().get(languages_path.parent().basename());
auto const& locale_display_names_object = locale_object.as_object().get("localeDisplayNames"sv); auto const& locale_display_names_object = locale_object.as_object().get("localeDisplayNames"sv);
auto const& languages_object = locale_display_names_object.as_object().get("languages"sv); auto const& languages_object = locale_display_names_object.as_object().get("languages"sv);
@ -225,10 +221,9 @@ static void parse_locale_territories(String locale_path, UnicodeLocaleData& loca
auto territories_file_or_error = Core::File::open(territories_path.string(), Core::OpenMode::ReadOnly); auto territories_file_or_error = Core::File::open(territories_path.string(), Core::OpenMode::ReadOnly);
VERIFY(!territories_file_or_error.is_error()); VERIFY(!territories_file_or_error.is_error());
auto territories = JsonParser(territories_file_or_error.value()->read_all()).parse(); auto territories = JsonValue::from_string(territories_file_or_error.value()->read_all()).release_value_but_fixme_should_propagate_errors();
VERIFY(territories.has_value());
auto const& main_object = territories->as_object().get("main"sv); auto const& main_object = territories.as_object().get("main"sv);
auto const& locale_object = main_object.as_object().get(territories_path.parent().basename()); auto const& locale_object = main_object.as_object().get(territories_path.parent().basename());
auto const& locale_display_names_object = locale_object.as_object().get("localeDisplayNames"sv); auto const& locale_display_names_object = locale_object.as_object().get("localeDisplayNames"sv);
auto const& territories_object = locale_display_names_object.as_object().get("territories"sv); auto const& territories_object = locale_display_names_object.as_object().get("territories"sv);
@ -251,10 +246,9 @@ static void parse_locale_scripts(String locale_path, UnicodeLocaleData& locale_d
auto scripts_file_or_error = Core::File::open(scripts_path.string(), Core::OpenMode::ReadOnly); auto scripts_file_or_error = Core::File::open(scripts_path.string(), Core::OpenMode::ReadOnly);
VERIFY(!scripts_file_or_error.is_error()); VERIFY(!scripts_file_or_error.is_error());
auto scripts = JsonParser(scripts_file_or_error.value()->read_all()).parse(); auto scripts = JsonValue::from_string(scripts_file_or_error.value()->read_all()).release_value_but_fixme_should_propagate_errors();
VERIFY(scripts.has_value());
auto const& main_object = scripts->as_object().get("main"sv); auto const& main_object = scripts.as_object().get("main"sv);
auto const& locale_object = main_object.as_object().get(scripts_path.parent().basename()); auto const& locale_object = main_object.as_object().get(scripts_path.parent().basename());
auto const& locale_display_names_object = locale_object.as_object().get("localeDisplayNames"sv); auto const& locale_display_names_object = locale_object.as_object().get("localeDisplayNames"sv);
auto const& scripts_object = locale_display_names_object.as_object().get("scripts"sv); auto const& scripts_object = locale_display_names_object.as_object().get("scripts"sv);
@ -277,10 +271,9 @@ static void parse_locale_list_patterns(String misc_path, UnicodeLocaleData& loca
auto list_patterns_file_or_error = Core::File::open(list_patterns_path.string(), Core::OpenMode::ReadOnly); auto list_patterns_file_or_error = Core::File::open(list_patterns_path.string(), Core::OpenMode::ReadOnly);
VERIFY(!list_patterns_file_or_error.is_error()); VERIFY(!list_patterns_file_or_error.is_error());
auto list_patterns = JsonParser(list_patterns_file_or_error.value()->read_all()).parse(); auto list_patterns = JsonValue::from_string(list_patterns_file_or_error.value()->read_all()).release_value_but_fixme_should_propagate_errors();
VERIFY(list_patterns.has_value());
auto const& main_object = list_patterns->as_object().get("main"sv); auto const& main_object = list_patterns.as_object().get("main"sv);
auto const& locale_object = main_object.as_object().get(list_patterns_path.parent().basename()); auto const& locale_object = main_object.as_object().get(list_patterns_path.parent().basename());
auto const& list_patterns_object = locale_object.as_object().get("listPatterns"sv); auto const& list_patterns_object = locale_object.as_object().get("listPatterns"sv);
@ -329,10 +322,9 @@ static void parse_locale_currencies(String numbers_path, UnicodeLocaleData& loca
auto currencies_file_or_error = Core::File::open(currencies_path.string(), Core::OpenMode::ReadOnly); auto currencies_file_or_error = Core::File::open(currencies_path.string(), Core::OpenMode::ReadOnly);
VERIFY(!currencies_file_or_error.is_error()); VERIFY(!currencies_file_or_error.is_error());
auto currencies = JsonParser(currencies_file_or_error.value()->read_all()).parse(); auto currencies = JsonValue::from_string(currencies_file_or_error.value()->read_all()).release_value_but_fixme_should_propagate_errors();
VERIFY(currencies.has_value());
auto const& main_object = currencies->as_object().get("main"sv); auto const& main_object = currencies.as_object().get("main"sv);
auto const& locale_object = main_object.as_object().get(currencies_path.parent().basename()); auto const& locale_object = main_object.as_object().get(currencies_path.parent().basename());
auto const& locale_numbers_object = locale_object.as_object().get("numbers"sv); auto const& locale_numbers_object = locale_object.as_object().get("numbers"sv);
auto const& currencies_object = locale_numbers_object.as_object().get("currencies"sv); auto const& currencies_object = locale_numbers_object.as_object().get("currencies"sv);
@ -364,10 +356,9 @@ static void parse_numeric_keywords(String locale_numbers_path, UnicodeLocaleData
auto numbers_file_or_error = Core::File::open(numbers_path.string(), Core::OpenMode::ReadOnly); auto numbers_file_or_error = Core::File::open(numbers_path.string(), Core::OpenMode::ReadOnly);
VERIFY(!numbers_file_or_error.is_error()); VERIFY(!numbers_file_or_error.is_error());
auto numbers = JsonParser(numbers_file_or_error.value()->read_all()).parse(); auto numbers = JsonValue::from_string(numbers_file_or_error.value()->read_all()).release_value_but_fixme_should_propagate_errors();
VERIFY(numbers.has_value());
auto const& main_object = numbers->as_object().get("main"sv); auto const& main_object = numbers.as_object().get("main"sv);
auto const& locale_object = main_object.as_object().get(numbers_path.parent().basename()); auto const& locale_object = main_object.as_object().get(numbers_path.parent().basename());
auto const& locale_numbers_object = locale_object.as_object().get("numbers"sv); auto const& locale_numbers_object = locale_object.as_object().get("numbers"sv);
auto const& default_numbering_system_object = locale_numbers_object.as_object().get("defaultNumberingSystem"sv); auto const& default_numbering_system_object = locale_numbers_object.as_object().get("defaultNumberingSystem"sv);

View file

@ -240,10 +240,9 @@ static void parse_number_systems(String locale_numbers_path, UnicodeLocaleData&
auto numbers_file_or_error = Core::File::open(numbers_path.string(), Core::OpenMode::ReadOnly); auto numbers_file_or_error = Core::File::open(numbers_path.string(), Core::OpenMode::ReadOnly);
VERIFY(!numbers_file_or_error.is_error()); VERIFY(!numbers_file_or_error.is_error());
auto numbers = JsonParser(numbers_file_or_error.value()->read_all()).parse(); auto numbers = JsonValue::from_string(numbers_file_or_error.value()->read_all()).release_value_but_fixme_should_propagate_errors();
VERIFY(numbers.has_value());
auto const& main_object = numbers->as_object().get("main"sv); auto const& main_object = numbers.as_object().get("main"sv);
auto const& locale_object = main_object.as_object().get(numbers_path.parent().basename()); auto const& locale_object = main_object.as_object().get(numbers_path.parent().basename());
auto const& locale_numbers_object = locale_object.as_object().get("numbers"sv); auto const& locale_numbers_object = locale_object.as_object().get("numbers"sv);
@ -360,10 +359,9 @@ static void parse_units(String locale_units_path, UnicodeLocaleData& locale_data
auto units_file_or_error = Core::File::open(units_path.string(), Core::OpenMode::ReadOnly); auto units_file_or_error = Core::File::open(units_path.string(), Core::OpenMode::ReadOnly);
VERIFY(!units_file_or_error.is_error()); VERIFY(!units_file_or_error.is_error());
auto units = JsonParser(units_file_or_error.value()->read_all()).parse(); auto units = JsonValue::from_string(units_file_or_error.value()->read_all()).release_value_but_fixme_should_propagate_errors();
VERIFY(units.has_value());
auto const& main_object = units->as_object().get("main"sv); auto const& main_object = units.as_object().get("main"sv);
auto const& locale_object = main_object.as_object().get(units_path.parent().basename()); auto const& locale_object = main_object.as_object().get(units_path.parent().basename());
auto const& locale_units_object = locale_object.as_object().get("units"sv); auto const& locale_units_object = locale_object.as_object().get("units"sv);
auto const& long_object = locale_units_object.as_object().get("long"sv); auto const& long_object = locale_units_object.as_object().get("long"sv);

View file

@ -161,10 +161,9 @@ void parse_default_content_locales(String core_path, LocaleDataType& locale_data
auto default_content_file_or_error = Core::File::open(default_content_path.string(), Core::OpenMode::ReadOnly); auto default_content_file_or_error = Core::File::open(default_content_path.string(), Core::OpenMode::ReadOnly);
VERIFY(!default_content_file_or_error.is_error()); VERIFY(!default_content_file_or_error.is_error());
auto default_content = JsonParser(default_content_file_or_error.value()->read_all()).parse(); auto default_content = JsonValue::from_string(default_content_file_or_error.value()->read_all()).release_value_but_fixme_should_propagate_errors();
VERIFY(default_content.has_value());
auto const& default_content_array = default_content->as_object().get("defaultContent"sv); auto const& default_content_array = default_content.as_object().get("defaultContent"sv);
default_content_array.as_array().for_each([&](JsonValue const& value) { default_content_array.as_array().for_each([&](JsonValue const& value) {
auto locale = value.as_string(); auto locale = value.as_string();

View file

@ -58,11 +58,10 @@ int main(int argc, char** argv)
if (!file->open(Core::OpenMode::ReadOnly)) if (!file->open(Core::OpenMode::ReadOnly))
return 1; return 1;
auto json = JsonValue::from_string(file->read_all()); auto json = JsonValue::from_string(file->read_all()).release_value_but_fixme_should_propagate_errors();
VERIFY(json.has_value()); VERIFY(json.is_object());
VERIFY(json.value().is_object());
auto& properties = json.value().as_object(); auto& properties = json.as_object();
StringBuilder builder; StringBuilder builder;
SourceGenerator generator { builder }; SourceGenerator generator { builder };

View file

@ -36,9 +36,8 @@ int main(int argc, char** argv)
if (!file->open(Core::OpenMode::ReadOnly)) if (!file->open(Core::OpenMode::ReadOnly))
return 1; return 1;
auto json = JsonValue::from_string(file->read_all()); auto json = JsonValue::from_string(file->read_all()).release_value_but_fixme_should_propagate_errors();
VERIFY(json.has_value()); VERIFY(json.is_object());
VERIFY(json.value().is_object());
StringBuilder builder; StringBuilder builder;
SourceGenerator generator { builder }; SourceGenerator generator { builder };
@ -60,7 +59,7 @@ enum class PropertyID {
Vector<String> shorthand_property_ids; Vector<String> shorthand_property_ids;
Vector<String> longhand_property_ids; Vector<String> longhand_property_ids;
json.value().as_object().for_each_member([&](auto& name, auto& value) { json.as_object().for_each_member([&](auto& name, auto& value) {
VERIFY(value.is_object()); VERIFY(value.is_object());
if (value.as_object().has("longhands")) if (value.as_object().has("longhands"))
shorthand_property_ids.append(name); shorthand_property_ids.append(name);

View file

@ -36,9 +36,8 @@ int main(int argc, char** argv)
if (!file->open(Core::OpenMode::ReadOnly)) if (!file->open(Core::OpenMode::ReadOnly))
return 1; return 1;
auto json = JsonValue::from_string(file->read_all()); auto json = JsonValue::from_string(file->read_all()).release_value_but_fixme_should_propagate_errors();
VERIFY(json.has_value()); VERIFY(json.is_array());
VERIFY(json.value().is_array());
StringBuilder builder; StringBuilder builder;
SourceGenerator generator { builder }; SourceGenerator generator { builder };
@ -53,7 +52,7 @@ ValueID value_id_from_string(StringView string)
{ {
)~~~"); )~~~");
json.value().as_array().for_each([&](auto& name) { json.as_array().for_each([&](auto& name) {
auto member_generator = generator.fork(); auto member_generator = generator.fork();
member_generator.set("name", name.to_string()); member_generator.set("name", name.to_string());
member_generator.set("name:titlecase", title_casify(name.to_string())); member_generator.set("name:titlecase", title_casify(name.to_string()));
@ -71,7 +70,7 @@ const char* string_from_value_id(ValueID value_id) {
switch (value_id) { switch (value_id) {
)~~~"); )~~~");
json.value().as_array().for_each([&](auto& name) { json.as_array().for_each([&](auto& name) {
auto member_generator = generator.fork(); auto member_generator = generator.fork();
member_generator.set("name", name.to_string()); member_generator.set("name", name.to_string());
member_generator.set("name:titlecase", title_casify(name.to_string())); member_generator.set("name:titlecase", title_casify(name.to_string()));

View file

@ -36,9 +36,8 @@ int main(int argc, char** argv)
if (!file->open(Core::OpenMode::ReadOnly)) if (!file->open(Core::OpenMode::ReadOnly))
return 1; return 1;
auto json = JsonValue::from_string(file->read_all()); auto json = JsonValue::from_string(file->read_all()).release_value_but_fixme_should_propagate_errors();
VERIFY(json.has_value()); VERIFY(json.is_array());
VERIFY(json.value().is_array());
StringBuilder builder; StringBuilder builder;
SourceGenerator generator { builder }; SourceGenerator generator { builder };
@ -54,7 +53,7 @@ enum class ValueID {
Invalid, Invalid,
)~~~"); )~~~");
json.value().as_array().for_each([&](auto& name) { json.as_array().for_each([&](auto& name) {
auto member_generator = generator.fork(); auto member_generator = generator.fork();
member_generator.set("name:titlecase", title_casify(name.to_string())); member_generator.set("name:titlecase", title_casify(name.to_string()));

View file

@ -86,7 +86,7 @@ FIXME: Parse JSON from a Utf8View
TEST_CASE(json_utf8_multibyte) TEST_CASE(json_utf8_multibyte)
{ {
auto json_or_error = JsonValue::from_string("\"š\""); auto json_or_error = JsonValue::from_string("\"š\"");
EXPECT_EQ(json_or_error.has_value(), true); EXPECT_EQ(json_or_error.is_error(), false);
auto& json = json_or_error.value(); auto& json = json_or_error.value();
EXPECT_EQ(json.type(), JsonValue::Type::String); EXPECT_EQ(json.type(), JsonValue::Type::String);
@ -119,6 +119,6 @@ TEST_CASE(json_u64_roundtrip)
auto big_value = 0xffffffffffffffffull; auto big_value = 0xffffffffffffffffull;
auto json = JsonValue(big_value).to_string(); auto json = JsonValue(big_value).to_string();
auto value = JsonValue::from_string(json); auto value = JsonValue::from_string(json);
EXPECT_EQ_FORCE(value.has_value(), true); EXPECT_EQ_FORCE(value.is_error(), false);
EXPECT_EQ(value->as_u64(), big_value); EXPECT_EQ(value.value().as_u64(), big_value);
} }

View file

@ -115,7 +115,7 @@ private:
auto file_contents = file->read_all(); auto file_contents = file->read_all();
auto json = JsonValue::from_string(file_contents); auto json = JsonValue::from_string(file_contents);
if (!json.has_value()) if (json.is_error())
return adapter_info.to_string(); return adapter_info.to_string();
int connected_adapters = 0; int connected_adapters = 0;

View file

@ -135,9 +135,8 @@ private:
} }
auto file_contents = m_proc_stat->read_all(); auto file_contents = m_proc_stat->read_all();
auto json = JsonValue::from_string(file_contents); auto json = JsonValue::from_string(file_contents).release_value_but_fixme_should_propagate_errors();
VERIFY(json.has_value()); auto const& obj = json.as_object();
auto& obj = json.value().as_object();
total = obj.get("total_time").to_u64(); total = obj.get("total_time").to_u64();
idle = obj.get("idle_time").to_u64(); idle = obj.get("idle_time").to_u64();
return true; return true;
@ -157,9 +156,8 @@ private:
} }
auto file_contents = m_proc_mem->read_all(); auto file_contents = m_proc_mem->read_all();
auto json = JsonValue::from_string(file_contents); auto json = JsonValue::from_string(file_contents).release_value_but_fixme_should_propagate_errors();
VERIFY(json.has_value()); auto const& obj = json.as_object();
auto& obj = json.value().as_object();
unsigned kmalloc_allocated = obj.get("kmalloc_allocated").to_u32(); unsigned kmalloc_allocated = obj.get("kmalloc_allocated").to_u32();
unsigned kmalloc_available = obj.get("kmalloc_available").to_u32(); unsigned kmalloc_available = obj.get("kmalloc_available").to_u32();
auto user_physical_allocated = obj.get("user_physical_allocated").to_u64(); auto user_physical_allocated = obj.get("user_physical_allocated").to_u64();

View file

@ -67,9 +67,8 @@ int main(int argc, char** argv)
if (!proc_keymap->open(Core::OpenMode::ReadOnly)) if (!proc_keymap->open(Core::OpenMode::ReadOnly))
VERIFY_NOT_REACHED(); VERIFY_NOT_REACHED();
auto json = JsonValue::from_string(proc_keymap->read_all()); auto json = JsonValue::from_string(proc_keymap->read_all()).release_value_but_fixme_should_propagate_errors();
VERIFY(json.has_value()); auto const& keymap_object = json.as_object();
JsonObject keymap_object = json.value().as_object();
VERIFY(keymap_object.has("keymap")); VERIFY(keymap_object.has("keymap"));
String current_keymap = keymap_object.get("keymap").to_string(); String current_keymap = keymap_object.get("keymap").to_string();
dbgln("KeyboardSettings thinks the current keymap is: {}", current_keymap); dbgln("KeyboardSettings thinks the current keymap is: {}", current_keymap);

View file

@ -26,7 +26,7 @@ ErrorOr<void> ProjectLoader::try_load_from_fd_and_close(int fd, StringView path)
auto contents = file->read_all(); auto contents = file->read_all();
auto json_or_error = JsonValue::from_string(contents); auto json_or_error = JsonValue::from_string(contents);
if (!json_or_error.has_value()) { if (json_or_error.is_error()) {
m_is_raw_image = true; m_is_raw_image = true;
auto mapped_file = TRY(MappedFile::map_from_fd_and_close(fd, path)); auto mapped_file = TRY(MappedFile::map_from_fd_and_close(fd, path));

View file

@ -84,10 +84,9 @@ static void fill_mounts(Vector<MountInfo>& output)
} }
auto content = file->read_all(); auto content = file->read_all();
auto json = JsonValue::from_string(content); auto json = JsonValue::from_string(content).release_value_but_fixme_should_propagate_errors();
VERIFY(json.has_value());
json.value().as_array().for_each([&output](auto& value) { json.as_array().for_each([&output](auto& value) {
auto& filesystem_object = value.as_object(); auto& filesystem_object = value.as_object();
MountInfo mount_info; MountInfo mount_info;
mount_info.mount_point = filesystem_object.get("mount_point").to_string(); mount_info.mount_point = filesystem_object.get("mount_point").to_string();

View file

@ -209,7 +209,7 @@ Result<NonnullRefPtrVector<Sheet>, String> ImportDialog::make_and_run_for(String
auto import_worksheet = [&]() -> Result<NonnullRefPtrVector<Sheet>, String> { auto import_worksheet = [&]() -> Result<NonnullRefPtrVector<Sheet>, String> {
auto json_value_option = JsonParser(file.read_all()).parse(); auto json_value_option = JsonParser(file.read_all()).parse();
if (!json_value_option.has_value()) { if (json_value_option.is_error()) {
StringBuilder sb; StringBuilder sb;
sb.append("Failed to parse "); sb.append("Failed to parse ");
sb.append(file.filename()); sb.append(file.filename());

View file

@ -667,7 +667,7 @@ JsonObject Sheet::gather_documentation() const
JsonParser parser(doc.to_string_without_side_effects()); JsonParser parser(doc.to_string_without_side_effects());
auto doc_object = parser.parse(); auto doc_object = parser.parse();
if (doc_object.has_value()) if (!doc_object.is_error())
object.set(it.key.to_display_string(), doc_object.value()); object.set(it.key.to_display_string(), doc_object.value());
else else
dbgln("Sheet::gather_documentation(): Failed to parse the documentation for '{}'!", it.key.to_display_string()); dbgln("Sheet::gather_documentation(): Failed to parse the documentation for '{}'!", it.key.to_display_string());

View file

@ -84,9 +84,8 @@ void MemoryStatsWidget::refresh()
VERIFY_NOT_REACHED(); VERIFY_NOT_REACHED();
auto file_contents = proc_memstat->read_all(); auto file_contents = proc_memstat->read_all();
auto json_result = JsonValue::from_string(file_contents); auto json_result = JsonValue::from_string(file_contents).release_value_but_fixme_should_propagate_errors();
VERIFY(json_result.has_value()); auto const& json = json_result.as_object();
auto json = json_result.value().as_object();
[[maybe_unused]] u32 kmalloc_eternal_allocated = json.get("kmalloc_eternal_allocated").to_u32(); [[maybe_unused]] u32 kmalloc_eternal_allocated = json.get("kmalloc_eternal_allocated").to_u32();
u32 kmalloc_allocated = json.get("kmalloc_allocated").to_u32(); u32 kmalloc_allocated = json.get("kmalloc_allocated").to_u32();

View file

@ -220,7 +220,7 @@ ErrorOr<NonnullOwnPtr<Profile>> Profile::load_from_perfcore_file(StringView path
auto file = TRY(Core::File::open(path, Core::OpenMode::ReadOnly)); auto file = TRY(Core::File::open(path, Core::OpenMode::ReadOnly));
auto json = JsonValue::from_string(file->read_all()); auto json = JsonValue::from_string(file->read_all());
if (!json.has_value() || !json.value().is_object()) if (json.is_error() || !json.value().is_object())
return Error::from_string_literal("Invalid perfcore format (not a JSON object)"sv); return Error::from_string_literal("Invalid perfcore format (not a JSON object)"sv);
auto& object = json.value().as_object(); auto& object = json.value().as_object();

View file

@ -144,7 +144,7 @@ private:
auto request = m_socket->read(length); auto request = m_socket->read(length);
auto request_json = JsonValue::from_string(request); auto request_json = JsonValue::from_string(request);
if (!request_json.has_value() || !request_json.value().is_object()) { if (request_json.is_error() || !request_json.value().is_object()) {
dbgln("RPC client sent invalid request"); dbgln("RPC client sent invalid request");
shutdown(); shutdown();
return; return;

View file

@ -35,7 +35,7 @@ Optional<AllProcessesStatistics> ProcessStatisticsReader::get_all(RefPtr<Core::F
auto file_contents = proc_all_file->read_all(); auto file_contents = proc_all_file->read_all();
auto json = JsonValue::from_string(file_contents); auto json = JsonValue::from_string(file_contents);
if (!json.has_value()) if (json.is_error())
return {}; return {};
auto& json_obj = json.value().as_object(); auto& json_obj = json.value().as_object();

View file

@ -149,7 +149,7 @@ const JsonObject Reader::process_info() const
if (!process_info_notes_entry) if (!process_info_notes_entry)
return {}; return {};
auto process_info_json_value = JsonValue::from_string(process_info_notes_entry->json_data); auto process_info_json_value = JsonValue::from_string(process_info_notes_entry->json_data);
if (!process_info_json_value.has_value()) if (process_info_json_value.is_error())
return {}; return {};
if (!process_info_json_value.value().is_object()) if (!process_info_json_value.value().is_object())
return {}; return {};
@ -247,7 +247,7 @@ HashMap<String, String> Reader::metadata() const
if (!metadata_notes_entry) if (!metadata_notes_entry)
return {}; return {};
auto metadata_json_value = JsonValue::from_string(metadata_notes_entry->json_data); auto metadata_json_value = JsonValue::from_string(metadata_notes_entry->json_data);
if (!metadata_json_value.has_value()) if (metadata_json_value.is_error())
return {}; return {};
if (!metadata_json_value.value().is_object()) if (!metadata_json_value.value().is_object())
return {}; return {};

View file

@ -405,10 +405,9 @@ void DebugSession::update_loaded_libs()
VERIFY(rc); VERIFY(rc);
auto file_contents = file->read_all(); auto file_contents = file->read_all();
auto json = JsonValue::from_string(file_contents); auto json = JsonValue::from_string(file_contents).release_value_but_fixme_should_propagate_errors();
VERIFY(json.has_value());
auto vm_entries = json.value().as_array(); auto const& vm_entries = json.as_array();
Regex<PosixExtended> segment_name_re("(.+): "); Regex<PosixExtended> segment_name_re("(.+): ");
auto get_path_to_object = [&segment_name_re](String const& vm_name) -> Optional<String> { auto get_path_to_object = [&segment_name_re](String const& vm_name) -> Optional<String> {

View file

@ -17,9 +17,8 @@ namespace Desktop {
auto Launcher::Details::from_details_str(const String& details_str) -> NonnullRefPtr<Details> auto Launcher::Details::from_details_str(const String& details_str) -> NonnullRefPtr<Details>
{ {
auto details = adopt_ref(*new Details); auto details = adopt_ref(*new Details);
auto json = JsonValue::from_string(details_str); auto json = JsonValue::from_string(details_str).release_value_but_fixme_should_propagate_errors();
VERIFY(json.has_value()); auto const& obj = json.as_object();
auto obj = json.value().as_object();
details->executable = obj.get("executable").to_string(); details->executable = obj.get("executable").to_string();
details->name = obj.get("name").to_string(); details->name = obj.get("name").to_string();
if (auto type_value = obj.get_ptr("type")) { if (auto type_value = obj.get_ptr("type")) {

View file

@ -45,7 +45,7 @@ void CommonLocationsProvider::load_from_json(const String& json_path)
} }
auto json = JsonValue::from_string(file->read_all()); auto json = JsonValue::from_string(file->read_all());
if (!json.has_value()) { if (json.is_error()) {
dbgln("Common locations file {} is not a valid JSON file.", file->filename()); dbgln("Common locations file {} is not a valid JSON file.", file->filename());
return; return;
} }
@ -55,7 +55,7 @@ void CommonLocationsProvider::load_from_json(const String& json_path)
} }
s_common_locations.clear(); s_common_locations.clear();
auto contents = json.value().as_array(); auto const& contents = json.value().as_array();
for (size_t i = 0; i < contents.size(); ++i) { for (size_t i = 0; i < contents.size(); ++i) {
auto entry_value = contents.at(i); auto entry_value = contents.at(i);
if (!entry_value.is_object()) if (!entry_value.is_object())

View file

@ -94,7 +94,7 @@ static Optional<JsonValue> parse_core_object(Queue<GMLToken>& tokens)
} else if (peek() == GMLToken::Type::JsonValue) { } else if (peek() == GMLToken::Type::JsonValue) {
auto value_string = tokens.dequeue(); auto value_string = tokens.dequeue();
auto parsed_value = JsonValue::from_string(value_string.m_view); auto parsed_value = JsonValue::from_string(value_string.m_view);
if (!parsed_value.has_value()) { if (parsed_value.is_error()) {
dbgln("Expected property to be JSON value"); dbgln("Expected property to be JSON value");
return {}; return {};
} }

View file

@ -20,11 +20,10 @@ void JsonArrayModel::invalidate()
return; return;
} }
auto json = JsonValue::from_string(file->read_all()); auto json = JsonValue::from_string(file->read_all()).release_value_but_fixme_should_propagate_errors();
VERIFY(json.has_value()); VERIFY(json.is_array());
VERIFY(json.value().is_array()); m_array = json.as_array();
m_array = json.value().as_array();
did_update(); did_update();
} }

View file

@ -352,7 +352,7 @@ JS_DEFINE_NATIVE_FUNCTION(JSONObject::parse)
auto reviver = vm.argument(1); auto reviver = vm.argument(1);
auto json = JsonValue::from_string(string); auto json = JsonValue::from_string(string);
if (!json.has_value()) if (json.is_error())
return vm.throw_completion<SyntaxError>(global_object, ErrorType::JsonMalformed); return vm.throw_completion<SyntaxError>(global_object, ErrorType::JsonMalformed);
Value unfiltered = parse_json_value(global_object, json.value()); Value unfiltered = parse_json_value(global_object, json.value());
if (reviver.is_function()) { if (reviver.is_function()) {

View file

@ -31,7 +31,7 @@ Optional<CharacterMapData> CharacterMapFile::load_from_file(const String& filena
auto file_contents = file->read_all(); auto file_contents = file->read_all();
auto json_result = JsonValue::from_string(file_contents); auto json_result = JsonValue::from_string(file_contents);
if (!json_result.has_value()) { if (json_result.is_error()) {
dbgln("Failed to load character map from file {}", path); dbgln("Failed to load character map from file {}", path);
return {}; return {};
} }

View file

@ -158,7 +158,7 @@ Vector<Symbol> symbolicate_thread(pid_t pid, pid_t tid, IncludeSourcePosition in
} }
auto json = JsonValue::from_string(file_or_error.value()->read_all()); auto json = JsonValue::from_string(file_or_error.value()->read_all());
if (!json.has_value() || !json.value().is_array()) { if (json.is_error() || !json.value().is_array()) {
warnln("Invalid contents in {}", stack_path); warnln("Invalid contents in {}", stack_path);
return {}; return {};
} }
@ -178,7 +178,7 @@ Vector<Symbol> symbolicate_thread(pid_t pid, pid_t tid, IncludeSourcePosition in
} }
auto json = JsonValue::from_string(file_or_error.value()->read_all()); auto json = JsonValue::from_string(file_or_error.value()->read_all());
if (!json.has_value() || !json.value().is_array()) { if (json.is_error() || !json.value().is_array()) {
warnln("Invalid contents in {}", vm_path); warnln("Invalid contents in {}", vm_path);
return {}; return {};
} }

View file

@ -241,7 +241,7 @@ inline Optional<JsonValue> get_test_results(JS::Interpreter& interpreter)
auto json_string = TRY_OR_DISCARD(JS::JSONObject::stringify_impl(interpreter.global_object(), results, JS::js_undefined(), JS::js_undefined())); auto json_string = TRY_OR_DISCARD(JS::JSONObject::stringify_impl(interpreter.global_object(), results, JS::js_undefined(), JS::js_undefined()));
auto json = JsonValue::from_string(json_string); auto json = JsonValue::from_string(json_string);
if (!json.has_value()) if (json.is_error())
return {}; return {};
return json.value(); return json.value();

View file

@ -18,11 +18,8 @@ class DOMTreeModel final : public GUI::Model {
public: public:
static NonnullRefPtr<DOMTreeModel> create(StringView dom_tree, GUI::TreeView& tree_view) static NonnullRefPtr<DOMTreeModel> create(StringView dom_tree, GUI::TreeView& tree_view)
{ {
auto json_or_error = JsonValue::from_string(dom_tree); auto json_or_error = JsonValue::from_string(dom_tree).release_value_but_fixme_should_propagate_errors();
if (!json_or_error.has_value()) return adopt_ref(*new DOMTreeModel(json_or_error.as_object(), tree_view));
VERIFY_NOT_REACHED();
return adopt_ref(*new DOMTreeModel(json_or_error.value().as_object(), tree_view));
} }
virtual ~DOMTreeModel() override; virtual ~DOMTreeModel() override;

View file

@ -23,11 +23,8 @@ public:
static NonnullRefPtr<StylePropertiesModel> create(StringView properties) static NonnullRefPtr<StylePropertiesModel> create(StringView properties)
{ {
auto json_or_error = JsonValue::from_string(properties); auto json_or_error = JsonValue::from_string(properties).release_value_but_fixme_should_propagate_errors();
if (!json_or_error.has_value()) return adopt_ref(*new StylePropertiesModel(json_or_error.as_object()));
VERIFY_NOT_REACHED();
return adopt_ref(*new StylePropertiesModel(json_or_error.value().as_object()));
} }
virtual ~StylePropertiesModel() override; virtual ~StylePropertiesModel() override;

View file

@ -169,7 +169,7 @@ ErrorOr<DHCPv4Client::Interfaces> DHCPv4Client::get_discoverable_interfaces()
auto file_contents = file->read_all(); auto file_contents = file->read_all();
auto json = JsonValue::from_string(file_contents); auto json = JsonValue::from_string(file_contents);
if (!json.has_value() || !json.value().is_array()) { if (json.is_error() || !json.value().is_array()) {
dbgln("Error: No network adapters available"); dbgln("Error: No network adapters available");
return Error::from_string_literal("No network adapters available"sv); return Error::from_string_literal("No network adapters available"sv);
} }

View file

@ -121,12 +121,11 @@ Vector<IPv4Address> MulticastDNS::local_addresses() const
} }
auto file_contents = file->read_all(); auto file_contents = file->read_all();
auto json = JsonValue::from_string(file_contents); auto json = JsonValue::from_string(file_contents).release_value_but_fixme_should_propagate_errors();
VERIFY(json.has_value());
Vector<IPv4Address> addresses; Vector<IPv4Address> addresses;
json.value().as_array().for_each([&addresses](auto& value) { json.as_array().for_each([&addresses](auto& value) {
auto if_object = value.as_object(); auto if_object = value.as_object();
auto address = if_object.get("ipv4_address").to_string(); auto address = if_object.get("ipv4_address").to_string();
auto ipv4_address = IPv4Address::from_string(address); auto ipv4_address = IPv4Address::from_string(address);

View file

@ -100,10 +100,9 @@ int main(int argc, char** argv)
} }
auto file_contents = file->read_all(); auto file_contents = file->read_all();
auto json = JsonValue::from_string(file_contents); auto json = JsonValue::from_string(file_contents).release_value_but_fixme_should_propagate_errors();
VERIFY(json.has_value());
Vector<JsonValue> sorted_regions = json.value().as_array().values(); Vector<JsonValue> sorted_regions = json.as_array().values();
quick_sort(sorted_regions, [](auto& a, auto& b) { quick_sort(sorted_regions, [](auto& a, auto& b) {
return a.as_object().get("ip_address").to_string() < b.as_object().get("ip_address").to_string(); return a.as_object().get("ip_address").to_string() < b.as_object().get("ip_address").to_string();
}); });

View file

@ -47,9 +47,8 @@ int main(int argc, char** argv)
} }
auto file_contents = file->read_all(); auto file_contents = file->read_all();
auto json_result = JsonValue::from_string(file_contents); auto json_result = JsonValue::from_string(file_contents).release_value_but_fixme_should_propagate_errors();
VERIFY(json_result.has_value()); auto const& json = json_result.as_array();
auto json = json_result.value().as_array();
json.for_each([](auto& value) { json.for_each([](auto& value) {
auto& fs_object = value.as_object(); auto& fs_object = value.as_object();
auto fs = fs_object.get("class_name").to_string(); auto fs = fs_object.get("class_name").to_string();

View file

@ -100,16 +100,16 @@ int main(int argc, char** argv)
auto file_contents = file->read_all(); auto file_contents = file->read_all();
auto json = JsonValue::from_string(file_contents); auto json = JsonValue::from_string(file_contents);
if (!json.has_value()) { if (json.is_error()) {
warnln("Couldn't parse {} as JSON", path); warnln("Couldn't parse {} as JSON", path);
return 1; return 1;
} }
if (!json->is_array()) { if (!json.value().is_array()) {
warnln("{} does not contain an array of quotes", path); warnln("{} does not contain an array of quotes", path);
return 1; return 1;
} }
const auto quotes = parse_all(json->as_array()); const auto quotes = parse_all(json.value().as_array());
if (quotes.is_empty()) { if (quotes.is_empty()) {
warnln("{} does not contain any valid quotes", path); warnln("{} does not contain any valid quotes", path);
return 1; return 1;

View file

@ -69,7 +69,7 @@ int main(int argc, char** argv)
auto file_contents = file->read_all(); auto file_contents = file->read_all();
auto json = JsonValue::from_string(file_contents); auto json = JsonValue::from_string(file_contents);
if (!json.has_value()) { if (json.is_error()) {
if (path) { if (path) {
warnln("Failed to parse '{}' as JSON", path); warnln("Failed to parse '{}' as JSON", path);
} else { } else {

View file

@ -45,9 +45,8 @@ int main(int argc, char** argv)
} }
auto file_contents = file->read_all(); auto file_contents = file->read_all();
auto json = JsonValue::from_string(file_contents); auto json = JsonValue::from_string(file_contents).release_value_but_fixme_should_propagate_errors();
VERIFY(json.has_value()); json.as_array().for_each([](auto& value) {
json.value().as_array().for_each([](auto& value) {
auto& if_object = value.as_object(); auto& if_object = value.as_object();
auto name = if_object.get("name").to_string(); auto name = if_object.get("name").to_string();

View file

@ -53,7 +53,7 @@ int main(int argc, char** argv)
auto file_contents = file->read_all(); auto file_contents = file->read_all();
auto json = JsonValue::from_string(file_contents); auto json = JsonValue::from_string(file_contents);
if (!json.has_value()) { if (json.is_error()) {
warnln("Couldn't parse {} as JSON", path); warnln("Couldn't parse {} as JSON", path);
return 1; return 1;
} }

View file

@ -918,7 +918,7 @@ static JS::ThrowCompletionOr<JS::Value> load_json_impl(JS::VM& vm, JS::GlobalObj
return vm.throw_completion<JS::Error>(global_object, String::formatted("Failed to open '{}': {}", filename, file->error_string())); return vm.throw_completion<JS::Error>(global_object, String::formatted("Failed to open '{}': {}", filename, file->error_string()));
auto file_contents = file->read_all(); auto file_contents = file->read_all();
auto json = JsonValue::from_string(file_contents); auto json = JsonValue::from_string(file_contents);
if (!json.has_value()) if (json.is_error())
return vm.throw_completion<JS::SyntaxError>(global_object, JS::ErrorType::JsonMalformed); return vm.throw_completion<JS::SyntaxError>(global_object, JS::ErrorType::JsonMalformed);
return JS::JSONObject::parse_json_value(global_object, json.value()); return JS::JSONObject::parse_json_value(global_object, json.value());
} }

View file

@ -39,9 +39,8 @@ int main([[maybe_unused]] int argc, [[maybe_unused]] char** argv)
outln(" CPU0"); outln(" CPU0");
auto file_contents = proc_interrupts->read_all(); auto file_contents = proc_interrupts->read_all();
auto json = JsonValue::from_string(file_contents); auto json = JsonValue::from_string(file_contents).release_value_but_fixme_should_propagate_errors();
VERIFY(json.has_value()); json.as_array().for_each([](auto& value) {
json.value().as_array().for_each([](auto& value) {
auto& handler = value.as_object(); auto& handler = value.as_object();
auto purpose = handler.get("purpose").to_string(); auto purpose = handler.get("purpose").to_string();
auto interrupt = handler.get("interrupt_line").to_string(); auto interrupt = handler.get("interrupt_line").to_string();

View file

@ -70,15 +70,10 @@ static Vector<OpenFile> get_open_files_by_pid(pid_t pid)
} }
auto data = file.value()->read_all(); auto data = file.value()->read_all();
JsonParser parser(data); auto json = JsonValue::from_string(data).release_value_but_fixme_should_propagate_errors();
auto result = parser.parse();
if (!result.has_value()) {
VERIFY_NOT_REACHED();
}
Vector<OpenFile> files; Vector<OpenFile> files;
result.value().as_array().for_each([pid, &files](const JsonValue& object) { json.as_array().for_each([pid, &files](const JsonValue& object) {
OpenFile open_file; OpenFile open_file;
open_file.pid = pid; open_file.pid = pid;
open_file.fd = object.as_object().get("fd").to_int(); open_file.fd = object.as_object().get("fd").to_int();

View file

@ -66,9 +66,8 @@ int main(int argc, char** argv)
} }
auto file_contents = proc_pci->read_all(); auto file_contents = proc_pci->read_all();
auto json = JsonValue::from_string(file_contents); auto json = JsonValue::from_string(file_contents).release_value_but_fixme_should_propagate_errors();
VERIFY(json.has_value()); json.as_array().for_each([db, format](auto& value) {
json.value().as_array().for_each([db, format](auto& value) {
auto& dev = value.as_object(); auto& dev = value.as_object();
auto domain = dev.get("domain").to_u32(); auto domain = dev.get("domain").to_u32();
auto bus = dev.get("bus").to_u32(); auto bus = dev.get("bus").to_u32();

View file

@ -59,10 +59,9 @@ int main(int argc, char** argv)
} }
auto contents = proc_usb_device->read_all(); auto contents = proc_usb_device->read_all();
auto json = JsonValue::from_string(contents); auto json = JsonValue::from_string(contents).release_value_but_fixme_should_propagate_errors();
VERIFY(json.has_value());
json.value().as_array().for_each([usb_db](auto& value) { json.as_array().for_each([usb_db](auto& value) {
auto& device_descriptor = value.as_object(); auto& device_descriptor = value.as_object();
auto device_address = device_descriptor.get("device_address").to_u32(); auto device_address = device_descriptor.get("device_address").to_u32();

View file

@ -124,10 +124,9 @@ static bool print_mounts()
} }
auto content = df->read_all(); auto content = df->read_all();
auto json = JsonValue::from_string(content); auto json = JsonValue::from_string(content).release_value_but_fixme_should_propagate_errors();
VERIFY(json.has_value());
json.value().as_array().for_each([](auto& value) { json.as_array().for_each([](auto& value) {
auto& fs_object = value.as_object(); auto& fs_object = value.as_object();
auto class_name = fs_object.get("class_name").to_string(); auto class_name = fs_object.get("class_name").to_string();
auto mount_point = fs_object.get("mount_point").to_string(); auto mount_point = fs_object.get("mount_point").to_string();

View file

@ -156,10 +156,9 @@ int main(int argc, char** argv)
} }
auto file_contents = file->read_all(); auto file_contents = file->read_all();
auto json = JsonValue::from_string(file_contents); auto json = JsonValue::from_string(file_contents).release_value_but_fixme_should_propagate_errors();
VERIFY(json.has_value());
Vector<JsonValue> sorted_regions = json.value().as_array().values(); Vector<JsonValue> sorted_regions = json.as_array().values();
quick_sort(sorted_regions, [](auto& a, auto& b) { quick_sort(sorted_regions, [](auto& a, auto& b) {
return a.as_object().get("local_port").to_u32() < b.as_object().get("local_port").to_u32(); return a.as_object().get("local_port").to_u32() < b.as_object().get("local_port").to_u32();
}); });
@ -210,10 +209,9 @@ int main(int argc, char** argv)
} }
auto file_contents = file->read_all(); auto file_contents = file->read_all();
auto json = JsonValue::from_string(file_contents); auto json = JsonValue::from_string(file_contents).release_value_but_fixme_should_propagate_errors();
VERIFY(json.has_value());
Vector<JsonValue> sorted_regions = json.value().as_array().values(); Vector<JsonValue> sorted_regions = json.as_array().values();
quick_sort(sorted_regions, [](auto& a, auto& b) { quick_sort(sorted_regions, [](auto& a, auto& b) {
return a.as_object().get("local_port").to_u32() < b.as_object().get("local_port").to_u32(); return a.as_object().get("local_port").to_u32() < b.as_object().get("local_port").to_u32();
}); });

View file

@ -56,10 +56,9 @@ int main(int argc, char** argv)
} }
auto file_contents = file->read_all(); auto file_contents = file->read_all();
auto json = JsonValue::from_string(file_contents); auto json = JsonValue::from_string(file_contents).release_value_but_fixme_should_propagate_errors();
VERIFY(json.has_value());
Vector<JsonValue> sorted_regions = json.value().as_array().values(); Vector<JsonValue> sorted_regions = json.as_array().values();
quick_sort(sorted_regions, [](auto& a, auto& b) { quick_sort(sorted_regions, [](auto& a, auto& b) {
return a.as_object().get("address").to_addr() < b.as_object().get("address").to_addr(); return a.as_object().get("address").to_addr() < b.as_object().get("address").to_addr();
}); });

View file

@ -63,7 +63,7 @@ int main(int argc, char** argv)
JsonObject json; JsonObject json;
if (!file_contents.is_empty()) { if (!file_contents.is_empty()) {
if (!previous_json.has_value() || !previous_json.value().is_object()) { if (previous_json.is_error() || !previous_json.value().is_object()) {
dbgln("Error: Could not parse JSON"); dbgln("Error: Could not parse JSON");
} else { } else {
json = previous_json.value().as_object(); json = previous_json.value().as_object();

View file

@ -50,7 +50,7 @@ int main()
} }
auto& file = *file_or_error.value(); auto& file = *file_or_error.value();
auto json = JsonValue::from_string(file.read_all()); auto json = JsonValue::from_string(file.read_all());
if (!json.has_value() || !json.value().is_object()) { if (json.is_error() || !json.value().is_object()) {
warnln("Error: Could not parse /var/run/utmp"); warnln("Error: Could not parse /var/run/utmp");
return 1; return 1;
} }