/* * Copyright 2018 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef SkottieJson_DEFINED #define SkottieJson_DEFINED #include "SkRefCnt.h" #include "rapidjson/document.h" class SkData; class SkStream; class SkString; namespace skottie { namespace json { class ValueRef { public: ValueRef() : fValue(nullptr) {} ValueRef(const rapidjson::Value& v) : fValue(v.IsNull() ? nullptr : &v) {} bool isNull() const { return !fValue; } bool isObject() const { return fValue && fValue->IsObject(); } bool isArray() const { return fValue && fValue->IsArray(); } template bool to(T*) const; template T toDefault(const T& defaultValue) const { T v; if (!this->to(&v)) { v = defaultValue; } return v; } size_t size() const; ValueRef operator[](size_t i) const; ValueRef operator[](const char* key) const; bool operator==(const ValueRef& other) const { return fValue == other.fValue; } bool operator!=(const ValueRef& other) const { return !(*this == other); } const rapidjson::Value* begin() const; const rapidjson::Value* end() const; SkString toString() const; private: const rapidjson::Value* fValue; }; // Container for the json DOM class Document { public: explicit Document(SkStream*); ValueRef root() const { return fDocument; } private: sk_sp fData; // raw data rapidjson::Document fDocument; // in-place json DOM }; } // namespace json } // namespace skottie #endif // SkottieJson_DEFINED