blob: 76e17c610efabc1992b90be5daab33fe6e68e112 [file] [log] [blame]
/*
* 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 <typename T>
bool to(T*) const;
template <typename T>
T toDefault(const T& defaultValue) const {
T v;
if (!this->to<T>(&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<SkData> fData; // raw data
rapidjson::Document fDocument; // in-place json DOM
};
} // namespace json
} // namespace skottie
#endif // SkottieJson_DEFINED