Gems/AWSCore/Code/Include/Framework/JsonWriter.h (165 lines of code) (raw):

/* * Copyright (c) Contributors to the Open 3D Engine Project. * For complete copyright and license terms please see the LICENSE at the root of this distribution. * * SPDX-License-Identifier: Apache-2.0 OR MIT * */ #pragma once #include <AzCore/std/string/string.h> #include <AzCore/std/containers/vector.h> #include <AzCore/JSON/writer.h> #include <aws/core/utils/memory/stl/AWSStreamFwd.h> namespace AWSCore { class JsonOutputStream { public: typedef char Ch; JsonOutputStream(std::ostream& os) : m_os(os) { } Ch Peek() const { AZ_Assert(false, "Not Implemented"); return '\0'; } Ch Take() { AZ_Assert(false, "Not Implemented"); return '\0'; } size_t Tell() const { AZ_Assert(false, "Not Implemented"); return 0; } Ch* PutBegin() { AZ_Assert(false, "Not Implemented"); return nullptr; } void Put(Ch c) { m_os.put(c); } void Flush() { m_os.flush(); } size_t PutEnd(Ch*) { AZ_Assert(false, "Not Implemented"); return 0; } private: JsonOutputStream(const JsonOutputStream&) = delete; JsonOutputStream& operator=(const JsonOutputStream&) = delete; std::ostream& m_os; }; class JsonWriter; /// The default GlobalWriteJson implementation. Provide /// specializations of this function in the ServiceApi /// namespace to implement serialization differently /// for specific types. template<class ObjectType> bool GlobalWriteJson(JsonWriter& writer, const ObjectType& source) { return source.WriteJson(writer); } /// Used to produce request json format content. class JsonWriter : public rapidjson::Writer<JsonOutputStream> { using BaseType = rapidjson::Writer<JsonOutputStream>; public: template<typename ObjectType> static bool WriteObject(JsonOutputStream& os, const ObjectType& object) { JsonWriter writer{ os }; return GlobalWriteJson(writer, object); } JsonWriter(JsonOutputStream& os) : BaseType{ os } { } bool Write(const char* s) { return String(s); } bool Write(const AZStd::string& s) { return String(s); } bool Write(int i) { return Int(i); } bool Write(unsigned i) { return Uint(i); } bool Write(int64_t i) { return Int64(i); } bool Write(uint64_t i) { return Uint64(i); } bool Write(bool b) { return Bool(b); } template<typename ElementType> bool Write(const AZStd::vector<ElementType, AZStd::allocator>& v) { return Array(v); } template<class ObjectType> bool Write(const ObjectType& o) { return Object(o); } template<class ValueType> bool Write(const char* key, const ValueType& value) { bool ok = Key(key); if (ok) { ok = Write(value); } return ok; } /// Write JSON format content directly to the writer's output stream. /// This can be used to efficiently output static content. bool WriteJson(const Ch* json) { if (json) { while (*json != '\0') { os_->Put(*json); ++json; } } return true; } /// Overload of String that calls c_str for you. bool String(const AZStd::string& str) { return BaseType::String(str.c_str()); } /// Write an object. The object can implement a WriteJson function /// or you can provide an GlobalWriteJson template function /// specialization. template<class ObjectType> bool Object(const ObjectType& obj) { return GlobalWriteJson(*this, obj); } template<class ElementType> bool Array(const AZStd::vector<ElementType, AZStd::allocator>& v) { bool ok = StartArray(); if (ok) { for (const ElementType& e : v) { ok = Write(e); if (!ok) break; } if (ok) { ok = EndArray(); } } return ok; } private: // Prohibit copy constructor & assignment operator. JsonWriter(const JsonWriter&) = delete; JsonWriter& operator=(const JsonWriter&) = delete; }; } // namespace AWSCore