diff --git a/src/oatpp/data/mapping/Tree.cpp b/src/oatpp/data/mapping/Tree.cpp index 59703d80..b383017c 100644 --- a/src/oatpp/data/mapping/Tree.cpp +++ b/src/oatpp/data/mapping/Tree.cpp @@ -695,6 +695,100 @@ const Tree::Attributes& Tree::attributes() const { return m_attributes; } +type::String Tree::toString() const { + + stream::BufferOutputStream ss(128); + + switch (m_type) { + + case Type::UNDEFINED: { + ss << "undefined"; + break; + } + case Type::NULL_VALUE: { + ss << "null"; + break; + } + + case Type::INTEGER: { + ss << getInteger(); + break; + } + case Type::FLOAT: { + ss << getFloat(); + break; + } + + case Type::BOOL: { + ss << getPrimitive(); + break; + } + case Type::INT_8: { + ss << getPrimitive(); + break; + } + case Type::UINT_8: { + ss << getPrimitive(); + break; + } + case Type::INT_16: { + ss << getPrimitive(); + break; + } + case Type::UINT_16: { + ss << getPrimitive(); + break; + } + case Type::INT_32: { + ss << getPrimitive(); + break; + } + case Type::UINT_32: { + ss << getPrimitive(); + break; + } + case Type::INT_64: { + ss << getPrimitive(); + break; + } + case Type::UINT_64: { + ss << getPrimitive(); + break; + } + case Type::FLOAT_32: { + ss << getPrimitive(); + break; + } + case Type::FLOAT_64: { + ss << getPrimitive(); + break; + } + case Type::STRING: { + ss << getString(); + break; + } + + case Type::VECTOR: { + ss << ""; + break; + } + case Type::MAP: { + ss << ""; + break; + } + case Type::PAIRS: { + ss << ""; + break; + } + + default: + break; + } + + return ss.toString(); + +} + type::String Tree::debugPrint(v_uint32 indent0, v_uint32 indentDelta, bool firstLineIndent) const { stream::BufferOutputStream ss; diff --git a/src/oatpp/data/mapping/Tree.hpp b/src/oatpp/data/mapping/Tree.hpp index 2fb89ae4..ea1db7c5 100644 --- a/src/oatpp/data/mapping/Tree.hpp +++ b/src/oatpp/data/mapping/Tree.hpp @@ -255,6 +255,8 @@ public: Attributes& attributes(); const Attributes& attributes() const; + type::String toString() const; + type::String debugPrint(v_uint32 indent0 = 0, v_uint32 indentDelta = 2, bool firstLineIndent = true) const; }; diff --git a/src/oatpp/web/url/mapping/Pattern.cpp b/src/oatpp/web/url/mapping/Pattern.cpp index 31035413..057abb7d 100644 --- a/src/oatpp/web/url/mapping/Pattern.cpp +++ b/src/oatpp/web/url/mapping/Pattern.cpp @@ -106,7 +106,7 @@ std::shared_ptr Pattern::parse(const oatpp::String& data){ return parse(reinterpret_cast(data->data()), static_cast(data->size())); } -v_char8 Pattern::findSysChar(oatpp::utils::parser::Caret& caret) { +v_char8 Pattern::findSysChar(oatpp::utils::parser::Caret& caret) const { auto data = caret.getData(); for (v_buff_size i = caret.getPosition(); i < caret.getDataSize(); i++) { v_char8 a = static_cast(data[i]); @@ -119,7 +119,7 @@ v_char8 Pattern::findSysChar(oatpp::utils::parser::Caret& caret) { return 0; } -bool Pattern::match(const StringKeyLabel& url, MatchMap& matchMap) { +bool Pattern::match(const StringKeyLabel& url, MatchMap& matchMap) const { oatpp::utils::parser::Caret caret(reinterpret_cast(url.getData()), url.getSize()); @@ -181,7 +181,22 @@ bool Pattern::match(const StringKeyLabel& url, MatchMap& matchMap) { } -oatpp::String Pattern::toString() { +oatpp::String Pattern::reconstruct(const data::mapping::Tree& params, const oatpp::String& tail) const { + oatpp::data::stream::BufferOutputStream stream; + for (const std::shared_ptr& part : *m_parts) { + if(part->function == Part::FUNCTION_CONST) { + stream.writeSimple("/", 1); + stream.writeSimple(part->text); + } else if(part->function == Part::FUNCTION_VAR) { + stream.writeSimple(params[part->text].toString()); + } else if(part->function == Part::FUNCTION_ANY_END) { + stream.writeSimple(tail); + } + } + return stream.toString(); +} + +oatpp::String Pattern::toString() const { oatpp::data::stream::BufferOutputStream stream; for (const std::shared_ptr& part : *m_parts) { if(part->function == Part::FUNCTION_CONST) { diff --git a/src/oatpp/web/url/mapping/Pattern.hpp b/src/oatpp/web/url/mapping/Pattern.hpp index 008b2d18..69c204c5 100644 --- a/src/oatpp/web/url/mapping/Pattern.hpp +++ b/src/oatpp/web/url/mapping/Pattern.hpp @@ -26,8 +26,8 @@ #define oatpp_web_url_mapping_Pattern_hpp #include "oatpp/data/share/MemoryLabel.hpp" - #include "oatpp/utils/parser/Caret.hpp" +#include "oatpp/data/mapping/Tree.hpp" #include #include @@ -99,7 +99,7 @@ private: private: std::shared_ptr>> m_parts{std::make_shared>>()}; private: - v_char8 findSysChar(oatpp::utils::parser::Caret& caret); + v_char8 findSysChar(oatpp::utils::parser::Caret& caret) const; public: static std::shared_ptr createShared(){ @@ -110,9 +110,10 @@ public: static std::shared_ptr parse(const char* data); static std::shared_ptr parse(const oatpp::String& data); - bool match(const StringKeyLabel& url, MatchMap& matchMap); - - oatpp::String toString(); + bool match(const StringKeyLabel& url, MatchMap& matchMap) const; + + oatpp::String reconstruct(const data::mapping::Tree& params, const oatpp::String& tail) const; + oatpp::String toString() const; };