| // Copyright 2019 the V8 project 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 V8_TORQUE_LS_JSON_H_ |
| #define V8_TORQUE_LS_JSON_H_ |
| |
| #include <map> |
| #include <memory> |
| #include <string> |
| #include <vector> |
| |
| #include "src/base/logging.h" |
| |
| namespace v8 { |
| namespace internal { |
| namespace torque { |
| namespace ls { |
| |
| struct JsonValue; |
| |
| using JsonObject = std::map<std::string, JsonValue>; |
| using JsonArray = std::vector<JsonValue>; |
| |
| struct JsonValue { |
| public: |
| enum { OBJECT, ARRAY, STRING, NUMBER, BOOL, IS_NULL } tag; |
| |
| // JsonValues can only be moved, not copied. |
| JsonValue() V8_NOEXCEPT = default; |
| constexpr JsonValue(const JsonValue& other) = delete; |
| JsonValue& operator=(const JsonValue& other) = delete; |
| |
| JsonValue(JsonValue&& other) V8_NOEXCEPT = default; |
| JsonValue& operator=(JsonValue&& other) V8_NOEXCEPT = default; |
| |
| static JsonValue From(double number) { |
| JsonValue result; |
| result.tag = JsonValue::NUMBER; |
| result.number_ = number; |
| return result; |
| } |
| |
| static JsonValue From(JsonObject object) { |
| JsonValue result; |
| result.tag = JsonValue::OBJECT; |
| result.object_ = std::make_unique<JsonObject>(std::move(object)); |
| return result; |
| } |
| |
| static JsonValue From(bool b) { |
| JsonValue result; |
| result.tag = JsonValue::BOOL; |
| result.flag_ = b; |
| return result; |
| } |
| |
| static JsonValue From(const std::string& string) { |
| JsonValue result; |
| result.tag = JsonValue::STRING; |
| result.string_ = string; |
| return result; |
| } |
| |
| static JsonValue From(JsonArray array) { |
| JsonValue result; |
| result.tag = JsonValue::ARRAY; |
| result.array_ = std::make_unique<JsonArray>(std::move(array)); |
| return result; |
| } |
| |
| static JsonValue JsonNull() { |
| JsonValue result; |
| result.tag = JsonValue::IS_NULL; |
| return result; |
| } |
| |
| bool IsNumber() const { return tag == NUMBER; } |
| double ToNumber() const { |
| CHECK(IsNumber()); |
| return number_; |
| } |
| |
| bool IsBool() const { return tag == BOOL; } |
| bool ToBool() const { |
| CHECK(IsBool()); |
| return flag_; |
| } |
| |
| bool IsString() const { return tag == STRING; } |
| const std::string& ToString() const { |
| CHECK(IsString()); |
| return string_; |
| } |
| |
| bool IsObject() const { return object_ && tag == OBJECT; } |
| const JsonObject& ToObject() const { |
| CHECK(IsObject()); |
| return *object_; |
| } |
| JsonObject& ToObject() { |
| CHECK(IsObject()); |
| return *object_; |
| } |
| |
| bool IsArray() const { return array_ && tag == ARRAY; } |
| const JsonArray& ToArray() const { |
| CHECK(IsArray()); |
| return *array_; |
| } |
| JsonArray& ToArray() { |
| CHECK(IsArray()); |
| return *array_; |
| } |
| |
| private: |
| double number_ = 0; |
| bool flag_ = false; |
| std::string string_; |
| std::unique_ptr<JsonObject> object_; |
| std::unique_ptr<JsonArray> array_; |
| }; |
| |
| std::string SerializeToString(const JsonValue& value); |
| |
| } // namespace ls |
| } // namespace torque |
| } // namespace internal |
| } // namespace v8 |
| |
| #endif // V8_TORQUE_LS_JSON_H_ |