123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220 |
- /*
- * 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
|