MakerLabs ACM
json_emitter.h
Go to the documentation of this file.
1 /*
2  * Copyright Paul Reimer, 2018
3  *
4  * This work is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike 4.0 Unported License.
5  * To view a copy of this license, visit
6  * https://creativecommons.org/licenses/by-nc-sa/4.0/
7  * or send a letter to
8  * Creative Commons, 444 Castro Street, Suite 900, Mountain View, California, 94041, USA.
9  */
10 
11 #pragma once
12 
13 #include "delegate.hpp"
14 
15 #include "stx/variant.hpp"
16 #include <experimental/string_view>
17 
18 #include <memory>
19 #include <string>
20 #include <vector>
21 
22 #include "yajl/yajl_gen.h"
23 #include "yajl/yajl_parse.h"
24 
25 namespace Json {
26 
28 {
29 public:
31  using string = std::string;
32 
33  using JsonPathComponent = stx::variant<int, string>;
34  using JsonPath = std::vector<JsonPathComponent>;
35 
36  using PostCallbackAction = bool;
37  static constexpr PostCallbackAction AbortProcessing = false;
38  static constexpr PostCallbackAction ContinueProcessing = false;
39 
42 
43  using JsonParserPtr = std::unique_ptr<yajl_handle_t, void(*)(yajl_handle_t*)>;
44  using JsonGenPtr = std::unique_ptr<yajl_gen_t, void(*)(yajl_gen_t*)>;
45 
46  JsonEmitter(const string_view match_path_str);
47  JsonEmitter(const JsonPath& _match_path={});
48  ~JsonEmitter() = default;
49 
50  auto init()
51  -> bool;
52  auto clear()
53  -> bool;
54  auto reset()
55  -> bool;
56 
57  auto parse(
58  const string_view chunk,
59  Callback&& _callback,
60  Errback&& _errback
61  ) -> bool;
62 
63  auto has_parse_state()
64  -> bool;
65 
66 protected:
67 // Callbacks must be public for access from static C
68 public:
69  auto on_json_parse_null()
70  -> int;
71  auto on_json_parse_boolean(const int b)
72  -> int;
73  auto on_json_parse_number(const char* s, const size_t l)
74  -> int;
75  auto on_json_parse_string(const unsigned char* s, const size_t l)
76  -> int;
77  auto on_json_parse_map_key(const unsigned char* s, const size_t l)
78  -> int;
80  -> int;
82  -> int;
84  -> int;
86  -> int;
87 
88 protected:
89  static auto parse_json_path(string_view json_path_str)
90  -> JsonPath;
91 
92 public:
93 
94 private:
95  // Convenience function to output JSON, then call the stored callback/errback
96  auto emit()
97  -> bool;
98 
99  // Emit JSON if path components are matched
100  const JsonPath match_path;
101 
102  // Input parsing state
103  JsonPath current_path;
104 
105  // Callback/errback triggered after each parsing emit event completed
106  Callback callback;
107  Errback errback;
108 
109  JsonParserPtr json_parser;
110  JsonGenPtr json_gen;
111 };
112 
113 } // namespace Json
auto on_json_parse_start_array() -> int
Definition: json_emitter.cpp:542
auto on_json_parse_null() -> int
Definition: json_emitter.cpp:308
auto reset() -> bool
Definition: json_emitter.cpp:224
auto on_json_parse_boolean(const int b) -> int
Definition: json_emitter.cpp:334
auto init() -> bool
Definition: json_emitter.cpp:211
std::experimental::string_view string_view
Definition: json_emitter.cpp:17
auto on_json_parse_string(const unsigned char *s, const size_t l) -> int
Definition: json_emitter.cpp:382
auto has_parse_state() -> bool
Definition: json_emitter.cpp:250
auto on_json_parse_number(const char *s, const size_t l) -> int
Definition: json_emitter.cpp:358
std::vector< JsonPathComponent > JsonPath
Definition: json_emitter.h:34
auto parse(const string_view chunk, Callback &&_callback, Errback &&_errback) -> bool
Definition: json_emitter.cpp:256
Definition: json_emitter.h:27
static auto parse_json_path(string_view json_path_str) -> JsonPath
Definition: json_emitter.cpp:595
delegate< PostCallbackAction(string_view)> Errback
Definition: json_emitter.h:41
~JsonEmitter()=default
static constexpr PostCallbackAction ContinueProcessing
Definition: json_emitter.h:38
bool PostCallbackAction
Definition: json_emitter.h:36
delegate< PostCallbackAction(string_view)> Callback
Definition: json_emitter.h:40
std::unique_ptr< yajl_gen_t, void(*)(yajl_gen_t *)> JsonGenPtr
Definition: json_emitter.h:44
static constexpr PostCallbackAction AbortProcessing
Definition: json_emitter.h:37
std::string string
Definition: oom_killer_actor_behaviour.cpp:24
std::experimental::string_view string_view
Definition: actor_model.cpp:16
auto on_json_parse_map_key(const unsigned char *s, const size_t l) -> int
Definition: json_emitter.cpp:414
std::experimental::string_view string_view
Definition: json_emitter.h:30
Definition: json_emitter.cpp:15
JsonEmitter(const string_view match_path_str)
Definition: json_emitter.cpp:195
auto on_json_parse_end_map() -> int
Definition: json_emitter.cpp:516
JsonEmitter::JsonPath JsonPath
Definition: json_emitter.cpp:21
stx::variant< int, string > JsonPathComponent
Definition: json_emitter.h:33
auto on_json_parse_end_array() -> int
Definition: json_emitter.cpp:568
auto clear() -> bool
Definition: json_emitter.cpp:241
auto on_json_parse_start_map() -> int
Definition: json_emitter.cpp:490
std::unique_ptr< yajl_handle_t, void(*)(yajl_handle_t *)> JsonParserPtr
Definition: json_emitter.h:43