libzypp 17.38.15

jsonparser_p.h
Go to the documentation of this file.
1/*---------------------------------------------------------------------\
2| ____ _ __ __ ___ |
3| |__ / \ / / . \ . \ |
4| / / \ V /| _/ _/ |
5| / /__ | | | | | | |
6| /_____||_| |_| |_| |
7| |
8\---------------------------------------------------------------------*/
14#ifndef ZYPP_CORE_PARSER_JSON_PARSER_H
15#define ZYPP_CORE_PARSER_JSON_PARSER_H
16
17#include <optional>
18#include <zypp-core/parser/parseexception.h>
19#include <zypp-core/base/inputstream.h>
20#include <zypp-core/base/NonCopyable.h>
21#include <zypp-core/ng/pipelines/expected.h>
22#include <zypp-core/ng/pipelines/mtry.h>
23#include <zypp-core/Globals.h>
24#include "../JsonValue.h"
25
26 namespace zypp::json::detail {
27
30 inline zyppng::expected<Number> numberFromString( const std::string & str ) {
31 using namespace zyppng::operators;
32 using zyppng::operators::operator|;
33 return zyppng::mtry( [&](){ return std::stod( str, nullptr ); } )
34 | and_then( []( double res ) -> zyppng::expected<Number> { return zyppng::make_expected_success( Number(res) ); } );
35 }
36
37 inline zyppng::expected<Int> intFromString( const std::string & str ) {
38 using namespace zyppng::operators;
39 using zyppng::operators::operator|;
40 return zyppng::mtry( [&](){ return std::stoll( str, nullptr ); } )
41 | and_then( []( std::int64_t res ) { return zyppng::make_expected_success( Int(res) ); } );
42 }
43
44 inline zyppng::expected<UInt> uintFromString( const std::string & str ) {
45 using namespace zyppng::operators;
46 using zyppng::operators::operator|;
47 return zyppng::mtry( [&](){ return std::stoull( str, nullptr ); } )
48 | and_then( []( unsigned long long res ) { return zyppng::make_expected_success( UInt(res) ); } );
49 }
50
51 // Parser is an internal implementation detail — no ZYPP_API.
52 // External code uses zypp::json::parseDocument() / parseDocumentExpected().
53 class Parser : private base::NonCopyable
54 {
55 public:
57 Parser() = default;
58 Parser(const Parser &) = delete;
59 Parser(Parser &&) = delete;
60 Parser &operator=(const Parser &) = delete;
61 Parser &operator=(Parser &&) = delete;
62
64 virtual ~Parser(){}
65
69 zyppng::expected<Value> parse( const InputStream & input_r );
70
71
72 struct Token {
73
74 enum Type {
75 TOK_STRING = 0,
76 TOK_NUMBER_FLOAT,
77 TOK_NUMBER_UINT,
78 TOK_NUMBER_INT,
79 TOK_BOOL_TRUE,
80 TOK_BOOL_FALSE,
81 TOK_NULL,
82 TOK_LSQUARE_BRACKET,
83 TOK_RSQUARE_BRACKET,
84 TOK_LCURLY_BRACKET,
85 TOK_RCURLY_BRACKET,
86 TOK_COMMA,
87 TOK_COLON,
88 TOK_END, // end of document
89 TOK_COUNT
90 };
91
92 Type _type;
93 std::string _token;
94
95 static Token eof();
96 };
97
98 zyppng::expected<Token> nextToken();
99
100 private:
101
102 zyppng::expected<Object> parseObject();
103 zyppng::expected<Array> parseArray();
104 zyppng::expected<Value> parseValue();
105 zyppng::expected<Value> finishParseValue( Token begin );
106
107
108 zyppng::expected<Token> parseStringToken();
109 zyppng::expected<Token> parseNumberToken();
110 zyppng::expected<Token> parseBoolToken();
111 zyppng::expected<Token> parseNullToken();
112
113
114 std::istream::char_type popChar();
115 std::istream::char_type peekChar();
116 void consumeChar();
117
118 zyppng::expected<void> consumeString( const std::string &str );
119
120 static inline std::istream::char_type eofChar() {
121 return std::istream::traits_type::eof();
122 }
123
124 template <typename T = Token>
125 zyppng::expected<T> makeParseError( const std::string &message, exception_detail::CodeLocation &&loc )
126 {
127 return zyppng::expected<T>::error(::zypp::exception_detail::do_ZYPP_EXCPT_PTR( parser::ParseException( message ), std::move(loc) ));
128 }
129
130 std::optional<InputStream> _stream;
131 int _nestingDepth = 0; //< how deep is the nesting ( prevent memory overflow by too deep nesting )
132 };
133
134} // namespace zypp::json::detail
135#endif
Globals.h
Provides API related macros.
JsonValue.h
NonCopyable.h
zypp::InputStream
Helper to create and pass std::istream.
Definition inputstream.h:57
zypp::json::Int::Int
Int()=default
zypp::json::Number::Number
Number()=default
zypp::json::UInt::UInt
UInt()=default
zypp::json::detail::Parser::parseNumberToken
zyppng::expected< Token > parseNumberToken()
Definition jsonparser_p.cc:323
zypp::json::detail::Parser::consumeString
zyppng::expected< void > consumeString(const std::string &str)
Definition jsonparser_p.cc:496
zypp::json::detail::Parser::eofChar
static std::istream::char_type eofChar()
Definition jsonparser_p.h:120
zypp::json::detail::Parser::consumeChar
void consumeChar()
Definition jsonparser_p.cc:490
zypp::json::detail::Parser::operator=
Parser & operator=(Parser &&)=delete
zypp::json::detail::Parser::parseBoolToken
zyppng::expected< Token > parseBoolToken()
Definition jsonparser_p.cc:302
zypp::json::detail::Parser::Parser
Parser(const Parser &)=delete
zypp::json::detail::Parser::parseValue
zyppng::expected< Value > parseValue()
Definition jsonparser_p.cc:252
zypp::json::detail::Parser::popChar
std::istream::char_type popChar()
Definition jsonparser_p.cc:466
zypp::json::detail::Parser::peekChar
std::istream::char_type peekChar()
Definition jsonparser_p.cc:478
zypp::json::detail::Parser::_nestingDepth
int _nestingDepth
Definition jsonparser_p.h:131
zypp::json::detail::Parser::makeParseError
zyppng::expected< T > makeParseError(const std::string &message, exception_detail::CodeLocation &&loc)
Definition jsonparser_p.h:125
zypp::json::detail::Parser::parseStringToken
zyppng::expected< Token > parseStringToken()
Definition jsonparser_p.cc:594
zypp::json::detail::Parser::operator=
Parser & operator=(const Parser &)=delete
zypp::json::detail::Parser::Parser
Parser(Parser &&)=delete
zypp::json::detail::Parser::~Parser
virtual ~Parser()
Dtor.
Definition jsonparser_p.h:64
zypp::json::detail::Parser::nextToken
zyppng::expected< Token > nextToken()
Definition jsonparser_p.cc:508
zypp::json::detail::Parser::parseArray
zyppng::expected< Array > parseArray()
Definition jsonparser_p.cc:184
zypp::json::detail::Parser::_stream
std::optional< InputStream > _stream
Definition jsonparser_p.h:130
zypp::json::detail::Parser::finishParseValue
zyppng::expected< Value > finishParseValue(Token begin)
Definition jsonparser_p.cc:265
zypp::json::detail::Parser::parseObject
zyppng::expected< Object > parseObject()
Definition jsonparser_p.cc:87
zypp::json::detail::Parser::parse
zyppng::expected< Value > parse(const InputStream &input_r)
Parse the stream.
Definition jsonparser_p.cc:37
zypp::json::detail::Parser::Parser
Parser()=default
Default ctor.
zypp::json::detail::Parser::parseNullToken
zyppng::expected< Token > parseNullToken()
Definition jsonparser_p.cc:293
zypp::parser::ParseException
Definition parseexception.h:34
zyppng::expected
Definition expected.h:56
zyppng::expected::error
E & error()
Definition expected.h:288
expected.h
inputstream.h
mtry.h
str
String related utilities and Regular expression matching.
zypp::base::NonCopyable
boost::noncopyable NonCopyable
Ensure derived classes cannot be copied.
Definition NonCopyable.h:26
zypp::exception_detail::do_ZYPP_EXCPT_PTR
std::exception_ptr do_ZYPP_EXCPT_PTR(TExcpt &&excpt_r, CodeLocation &&where_r)
Helper for ZYPP_EXCPT_PTR( Exception ).
Definition Exception.h:435
zypp::json::detail
Definition JsonString.h:20
zypp::json::detail::uintFromString
zyppng::expected< UInt > uintFromString(const std::string &str)
Definition jsonparser_p.h:44
zypp::json::detail::numberFromString
zyppng::expected< Number > numberFromString(const std::string &str)
fromString helpers — only callable from within the tokeniser.
Definition jsonparser_p.h:30
zypp::json::detail::intFromString
zyppng::expected< Int > intFromString(const std::string &str)
Definition jsonparser_p.h:37
zyppng::operators
Definition expected.h:699
zyppng::operators::and_then
auto and_then(Fun &&function)
Definition expected.h:708
zyppng::mtry
auto mtry(F &&f, Args &&...args)
Definition mtry.h:50
parseexception.h
zypp::exception_detail::CodeLocation
Keep FILE, FUNCTION and LINE.
Definition Exception.h:36
zypp::json::detail::Parser::Token
Definition jsonparser_p.h:72
zypp::json::detail::Parser::Token::_token
std::string _token
Definition jsonparser_p.h:93
zypp::json::detail::Parser::Token::eof
static Token eof()
Definition jsonparser_p.cc:752
zypp::json::detail::Parser::Token::_type
Type _type
Definition jsonparser_p.h:92
zypp::json::detail::Parser::Token::Type
Type
Definition jsonparser_p.h:74
zypp::json::detail::Parser::Token::TOK_LCURLY_BRACKET
@ TOK_LCURLY_BRACKET
Definition jsonparser_p.h:84
zypp::json::detail::Parser::Token::TOK_RCURLY_BRACKET
@ TOK_RCURLY_BRACKET
Definition jsonparser_p.h:85
zypp::json::detail::Parser::Token::TOK_COUNT
@ TOK_COUNT
Definition jsonparser_p.h:89
zypp::json::detail::Parser::Token::TOK_COLON
@ TOK_COLON
Definition jsonparser_p.h:87
zypp::json::detail::Parser::Token::TOK_END
@ TOK_END
Definition jsonparser_p.h:88
zypp::json::detail::Parser::Token::TOK_NUMBER_FLOAT
@ TOK_NUMBER_FLOAT
Definition jsonparser_p.h:76
zypp::json::detail::Parser::Token::TOK_NUMBER_UINT
@ TOK_NUMBER_UINT
Definition jsonparser_p.h:77
zypp::json::detail::Parser::Token::TOK_COMMA
@ TOK_COMMA
Definition jsonparser_p.h:86
zypp::json::detail::Parser::Token::TOK_BOOL_TRUE
@ TOK_BOOL_TRUE
Definition jsonparser_p.h:79
zypp::json::detail::Parser::Token::TOK_NULL
@ TOK_NULL
Definition jsonparser_p.h:81
zypp::json::detail::Parser::Token::TOK_LSQUARE_BRACKET
@ TOK_LSQUARE_BRACKET
Definition jsonparser_p.h:82
zypp::json::detail::Parser::Token::TOK_NUMBER_INT
@ TOK_NUMBER_INT
Definition jsonparser_p.h:78
zypp::json::detail::Parser::Token::TOK_RSQUARE_BRACKET
@ TOK_RSQUARE_BRACKET
Definition jsonparser_p.h:83
zypp::json::detail::Parser::Token::TOK_STRING
@ TOK_STRING
Definition jsonparser_p.h:75
zypp::json::detail::Parser::Token::TOK_BOOL_FALSE
@ TOK_BOOL_FALSE
Definition jsonparser_p.h:80