From 6352e8e3196f78388b6c771073f9e03eaa612673 Mon Sep 17 00:00:00 2001 From: Kae <80987908+Novaenia@users.noreply.github.com> Date: Tue, 20 Jun 2023 14:33:09 +1000 Subject: everything everywhere all at once --- source/core/StarJsonPath.cpp | 76 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 source/core/StarJsonPath.cpp (limited to 'source/core/StarJsonPath.cpp') diff --git a/source/core/StarJsonPath.cpp b/source/core/StarJsonPath.cpp new file mode 100644 index 0000000..9eb5fae --- /dev/null +++ b/source/core/StarJsonPath.cpp @@ -0,0 +1,76 @@ +#include "StarJsonPath.hpp" + +namespace Star { + +namespace JsonPath { + + TypeHint parsePointer(String& buffer, String const& path, String::const_iterator& iterator, String::const_iterator end) { + buffer.clear(); + + if (*iterator != '/') + throw ParsingException::format("Missing leading '/' in Json pointer \"%s\"", path); + iterator++; + + while (iterator != end && *iterator != '/') { + if (*iterator == '~') { + ++iterator; + if (iterator == end) + throw ParsingException::format("Incomplete escape sequence in Json pointer \"%s\"", path); + + if (*iterator == '0') + buffer.append('~'); + else if (*iterator == '1') + buffer.append('/'); + else + throw ParsingException::format("Invalid escape sequence in Json pointer \"%s\"", path); + ++iterator; + } else + buffer.append(*iterator++); + } + + Maybe index = maybeLexicalCast(buffer); + if (index.isValid() || (buffer == "-" && iterator == end)) + return TypeHint::Array; + return TypeHint::Object; + } + + TypeHint parseQueryPath(String& buffer, String const& path, String::const_iterator& iterator, String::const_iterator end) { + buffer.clear(); + + if (*iterator == '.') { + throw ParsingException::format("Entry starts with '.' in query path \"%s\"", path); + + } else if (*iterator == '[') { + // Parse array number and ']' + // Consume initial '[' + ++iterator; + + while (iterator != end && *iterator >= '0' && *iterator <= '9') + buffer.append(*iterator++); + + if (iterator == end || *iterator != ']') + throw ParsingException::format("Array has no trailing ']' or has invalid character in query path \"%s\"", path); + + // Consume trailing ']' + ++iterator; + + // Consume trailing '.' + if (iterator != end && *iterator == '.') + ++iterator; + + return TypeHint::Array; + + } else { + // Parse path up to next '.' or '[' + while (iterator != end && *iterator != '.' && *iterator != '[') + buffer.append(*iterator++); + + // Consume single trailing '.' if it exists + if (iterator != end && *iterator == '.') + ++iterator; + return TypeHint::Object; + } + } +} + +} -- cgit v1.2.3