From 5f0870ef3489b3a3c98dda5432dd8135a24ef884 Mon Sep 17 00:00:00 2001 From: Evan Driscoll Date: Sun, 3 Jun 2018 22:26:38 -0500 Subject: [PATCH] Expose the matcher predicate from fancy stylizer --- .../detail/output/fancy_serializer.hpp | 42 +++++++++++++++---- single_include/nlohmann/json.hpp | 42 +++++++++++++++---- test/src/unit-fancy-serialization.cpp | 4 +- 3 files changed, 68 insertions(+), 20 deletions(-) diff --git a/include/nlohmann/detail/output/fancy_serializer.hpp b/include/nlohmann/detail/output/fancy_serializer.hpp index 354fb2940..80a4c441a 100644 --- a/include/nlohmann/detail/output/fancy_serializer.hpp +++ b/include/nlohmann/detail/output/fancy_serializer.hpp @@ -14,6 +14,8 @@ #include // is_same #include #include +#include +#include #include #include @@ -53,6 +55,7 @@ class basic_fancy_serializer_stylizer public: using string_t = typename BasicJsonType::string_t; using json_pointer_t = json_pointer; + using matcher_predicate = std::function; basic_fancy_serializer_stylizer(fancy_serializer_style const& ds) : default_style(ds) @@ -75,23 +78,44 @@ class basic_fancy_serializer_stylizer const json_pointer_t& pointer, const fancy_serializer_style* active_style) const { - if (pointer.cbegin() == pointer.cend()) + for (auto const& pair : styles) { - return &get_default_style(); + if (pair.first(pointer)) + { + return &pair.second; + } } - auto iter = key_styles.find(*pointer.crbegin()); - return iter == key_styles.end() ? active_style : &iter->second; + return active_style; } - fancy_serializer_style& get_or_insert_style(const string_t& key) + fancy_serializer_style& register_style( + matcher_predicate p, + fancy_serializer_style style = fancy_serializer_style()) { - return key_styles[key]; + styles.emplace_back(p, style); + return styles.back().second; + } + + fancy_serializer_style& register_key_matcher_style( + string_t str, + fancy_serializer_style style = fancy_serializer_style()) + { + return register_style([str](const json_pointer_t& pointer) + { + return (pointer.cbegin() != pointer.cend()) + && (*pointer.crbegin() == str); + }, + style); + } + + fancy_serializer_style& last_registered_style() + { + return styles.back().second; } private: fancy_serializer_style default_style; - - std::map key_styles; + std::vector> styles; }; namespace detail @@ -130,7 +154,7 @@ class fancy_serializer void dump(const BasicJsonType& val, const bool ensure_ascii) { - dump(val, ensure_ascii, 0, nullptr, json_pointer_t()); + dump(val, ensure_ascii, 0, &stylizer.get_default_style(), json_pointer_t()); } private: diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp index 99c9ae923..3165d8129 100644 --- a/single_include/nlohmann/json.hpp +++ b/single_include/nlohmann/json.hpp @@ -10077,6 +10077,8 @@ class serializer #include // is_same #include #include +#include +#include // #include @@ -10858,6 +10860,7 @@ class basic_fancy_serializer_stylizer public: using string_t = typename BasicJsonType::string_t; using json_pointer_t = json_pointer; + using matcher_predicate = std::function; basic_fancy_serializer_stylizer(fancy_serializer_style const& ds) : default_style(ds) @@ -10880,23 +10883,44 @@ class basic_fancy_serializer_stylizer const json_pointer_t& pointer, const fancy_serializer_style* active_style) const { - if (pointer.cbegin() == pointer.cend()) + for (auto const& pair : styles) { - return &get_default_style(); + if (pair.first(pointer)) + { + return &pair.second; + } } - auto iter = key_styles.find(*pointer.crbegin()); - return iter == key_styles.end() ? active_style : &iter->second; + return active_style; } - fancy_serializer_style& get_or_insert_style(const string_t& key) + fancy_serializer_style& register_style( + matcher_predicate p, + fancy_serializer_style style = fancy_serializer_style()) { - return key_styles[key]; + styles.emplace_back(p, style); + return styles.back().second; + } + + fancy_serializer_style& register_key_matcher_style( + string_t str, + fancy_serializer_style style = fancy_serializer_style()) + { + return register_style([str](const json_pointer_t& pointer) + { + return (pointer.cbegin() != pointer.cend()) + && (*pointer.crbegin() == str); + }, + style); + } + + fancy_serializer_style& last_registered_style() + { + return styles.back().second; } private: fancy_serializer_style default_style; - - std::map key_styles; + std::vector> styles; }; namespace detail @@ -10935,7 +10959,7 @@ class fancy_serializer void dump(const BasicJsonType& val, const bool ensure_ascii) { - dump(val, ensure_ascii, 0, nullptr, json_pointer_t()); + dump(val, ensure_ascii, 0, &stylizer.get_default_style(), json_pointer_t()); } private: diff --git a/test/src/unit-fancy-serialization.cpp b/test/src/unit-fancy-serialization.cpp index 9e350678d..e9e23c6c8 100644 --- a/test/src/unit-fancy-serialization.cpp +++ b/test/src/unit-fancy-serialization.cpp @@ -234,7 +234,7 @@ TEST_CASE("serialization") { fancy_serializer_stylizer stylizer; stylizer.get_default_style().set_old_multiline(); - stylizer.get_or_insert_style("one line").multiline = false; + stylizer.register_key_matcher_style("one line").multiline = false; auto str = fancy_to_string( { @@ -261,7 +261,7 @@ TEST_CASE("serialization") { fancy_serializer_stylizer stylizer; stylizer.get_default_style().set_old_multiline(); - stylizer.get_or_insert_style("one line").indent_step = 0; + stylizer.register_key_matcher_style("one line").indent_step = 0; auto str = fancy_to_string( {