diff --git a/CHANGELOG.md b/CHANGELOG.md index 1e8ed28b..91d3135c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,11 @@ ArduinoJson: change log ======================= +HEAD +---- + +* Added support for custom writer classes (issue #1088) + v6.12.0 (2019-09-05) ------- diff --git a/extras/tests/JsonSerializer/CMakeLists.txt b/extras/tests/JsonSerializer/CMakeLists.txt index fb18c448..a6c98a12 100644 --- a/extras/tests/JsonSerializer/CMakeLists.txt +++ b/extras/tests/JsonSerializer/CMakeLists.txt @@ -3,6 +3,7 @@ # MIT License add_executable(JsonSerializerTests + CustomWriter.cpp JsonArray.cpp JsonArrayPretty.cpp JsonObject.cpp diff --git a/extras/tests/JsonSerializer/CustomWriter.cpp b/extras/tests/JsonSerializer/CustomWriter.cpp new file mode 100644 index 00000000..f78825dc --- /dev/null +++ b/extras/tests/JsonSerializer/CustomWriter.cpp @@ -0,0 +1,41 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2019 +// MIT License + +#include +#include + +struct CustomWriter { + std::string str; + + size_t write(uint8_t c) { + str.append(1, static_cast(c)); + return 1; + } + + size_t write(const uint8_t *s, size_t n) { + str.append(reinterpret_cast(s), n); + return n; + } +}; + +TEST_CASE("CustomWriter") { + DynamicJsonDocument doc(4096); + JsonArray array = doc.to(); + array.add(4); + array.add(2); + + SECTION("serializeJson()") { + CustomWriter writer; + serializeJson(array, writer); + + REQUIRE("[4,2]" == writer.str); + } + + SECTION("serializeJsonPretty") { + CustomWriter writer; + serializeJsonPretty(array, writer); + + REQUIRE("[\r\n 4,\r\n 2\r\n]" == writer.str); + } +} diff --git a/extras/tests/TextFormatter/CMakeLists.txt b/extras/tests/TextFormatter/CMakeLists.txt index ca235147..c2aba37d 100644 --- a/extras/tests/TextFormatter/CMakeLists.txt +++ b/extras/tests/TextFormatter/CMakeLists.txt @@ -2,10 +2,10 @@ # Copyright Benoit Blanchon 2014-2019 # MIT License -add_executable(JsonWriterTests +add_executable(TextFormatterTests writeFloat.cpp writeString.cpp ) -target_link_libraries(JsonWriterTests catch) -add_test(TextFormatter JsonWriterTests) +target_link_libraries(TextFormatterTests catch) +add_test(TextFormatter TextFormatterTests) diff --git a/src/ArduinoJson/Serialization/DynamicStringWriter.hpp b/src/ArduinoJson/Serialization/DynamicStringWriter.hpp index 2d4cff02..dd8e1a15 100644 --- a/src/ArduinoJson/Serialization/DynamicStringWriter.hpp +++ b/src/ArduinoJson/Serialization/DynamicStringWriter.hpp @@ -4,7 +4,9 @@ #pragma once +#include #include +#include #if ARDUINOJSON_ENABLE_ARDUINO_STRING #include @@ -79,4 +81,11 @@ class DynamicStringWriter > { string_type *_str; }; #endif + +template +struct WriterSelector< + TDestination, + typename enable_if::value>::type> { + typedef DynamicStringWriter writer_type; +}; } // namespace ARDUINOJSON_NAMESPACE diff --git a/src/ArduinoJson/Serialization/PrintWriter.hpp b/src/ArduinoJson/Serialization/PrintWriter.hpp new file mode 100644 index 00000000..f3c503ee --- /dev/null +++ b/src/ArduinoJson/Serialization/PrintWriter.hpp @@ -0,0 +1,37 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2019 +// MIT License + +#pragma once + +#include +#include + +namespace ARDUINOJSON_NAMESPACE { + +class PrintWriter { + public: + explicit PrintWriter(Print& print) : _print(print) {} + + size_t write(uint8_t c) { + return _print.write(c); + } + + size_t write(const uint8_t* s, size_t n) { + return _print.write(s, n); + } + + private: + // cannot be assigned + PrintWriter& operator=(const PrintWriter&); + + Print& _print; +}; + +template +struct WriterSelector< + TDestination, + typename enable_if::value>::type> { + typedef PrintWriter writer_type; +}; +} // namespace ARDUINOJSON_NAMESPACE diff --git a/src/ArduinoJson/Serialization/StreamWriter.hpp b/src/ArduinoJson/Serialization/StreamWriter.hpp index 2567a878..819f5bee 100644 --- a/src/ArduinoJson/Serialization/StreamWriter.hpp +++ b/src/ArduinoJson/Serialization/StreamWriter.hpp @@ -5,8 +5,7 @@ #pragma once #include - -#if ARDUINOJSON_ENABLE_STD_STREAM +#include #include @@ -33,6 +32,11 @@ class StreamWriter { std::ostream& _os; }; -} // namespace ARDUINOJSON_NAMESPACE -#endif // ARDUINOJSON_ENABLE_STD_STREAM +template +struct WriterSelector< + TDestination, + typename enable_if::value>::type> { + typedef StreamWriter writer_type; +}; +} // namespace ARDUINOJSON_NAMESPACE diff --git a/src/ArduinoJson/Serialization/WriterSelector.hpp b/src/ArduinoJson/Serialization/WriterSelector.hpp new file mode 100644 index 00000000..a1d31d4d --- /dev/null +++ b/src/ArduinoJson/Serialization/WriterSelector.hpp @@ -0,0 +1,17 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2019 +// MIT License + +#pragma once + +#include + +namespace ARDUINOJSON_NAMESPACE { + +template +struct WriterSelector { + // by default, assume destination implements the Writer concept + typedef TDestination& writer_type; +}; + +} // namespace ARDUINOJSON_NAMESPACE diff --git a/src/ArduinoJson/Serialization/serialize.hpp b/src/ArduinoJson/Serialization/serialize.hpp index a89b2f4a..39006c8b 100644 --- a/src/ArduinoJson/Serialization/serialize.hpp +++ b/src/ArduinoJson/Serialization/serialize.hpp @@ -4,6 +4,7 @@ #pragma once +#include #include #include @@ -11,30 +12,26 @@ #include #endif +#if ARDUINOJSON_ENABLE_ARDUINO_PRINT +#include +#endif + namespace ARDUINOJSON_NAMESPACE { template