// ArduinoJson - arduinojson.org // Copyright Benoit Blanchon 2014-2018 // MIT License #pragma once #include "../JsonBuffer.hpp" #include "../JsonVariant.hpp" #include "../TypeTraits/IsConst.hpp" #include "StringWriter.hpp" namespace ArduinoJson { namespace Internals { // Parse JSON string to create JsonArrays and JsonObjects // This internal class is not indended to be used directly. // Instead, use JsonBuffer.parseArray() or .parseObject() template class JsonParser { public: JsonParser(JsonBuffer *buffer, TReader reader, TWriter writer, uint8_t nestingLimit) : _buffer(buffer), _reader(reader), _writer(writer), _nestingLimit(nestingLimit) {} JsonArray &parseArray(); JsonObject &parseObject(); JsonVariant parseVariant() { JsonVariant result; parseAnythingTo(&result); return result; } private: JsonParser &operator=(const JsonParser &); // non-copiable static bool eat(TReader &, char charToSkip); FORCE_INLINE bool eat(char charToSkip) { return eat(_reader, charToSkip); } const char *parseString(); bool parseAnythingTo(JsonVariant *destination); inline bool parseArrayTo(JsonVariant *destination); inline bool parseObjectTo(JsonVariant *destination); inline bool parseStringTo(JsonVariant *destination); static inline bool isBetween(char c, char min, char max) { return min <= c && c <= max; } static inline bool canBeInNonQuotedString(char c) { return isBetween(c, '0', '9') || isBetween(c, '_', 'z') || isBetween(c, 'A', 'Z') || c == '+' || c == '-' || c == '.'; } static inline bool isQuote(char c) { return c == '\'' || c == '\"'; } JsonBuffer *_buffer; TReader _reader; TWriter _writer; uint8_t _nestingLimit; }; template struct JsonParserBuilder { typedef typename StringTraits::Reader InputReader; typedef JsonParser TParser; static TParser makeParser(TJsonBuffer *buffer, TString &json, uint8_t nestingLimit) { return TParser(buffer, InputReader(json), *buffer, nestingLimit); } }; template struct JsonParserBuilder::value>::type> { typedef typename StringTraits::Reader TReader; typedef StringWriter TWriter; typedef JsonParser TParser; static TParser makeParser(TJsonBuffer *buffer, TChar *json, uint8_t nestingLimit) { return TParser(buffer, TReader(json), TWriter(json), nestingLimit); } }; template inline typename JsonParserBuilder::TParser makeParser( TJsonBuffer *buffer, TString &json, uint8_t nestingLimit) { return JsonParserBuilder::makeParser(buffer, json, nestingLimit); } } // namespace Internals } // namespace ArduinoJson