Line data Source code
1 :
2 : #include "variant_match.hpp"
3 : #include "ibuilder.hpp"
4 :
5 : namespace wfc{ namespace jsonrpc{
6 :
7 18 : variant_match::variant_match( const std::shared_ptr<ibuilder>& builder )
8 18 : : _builder(builder)
9 : {
10 18 : }
11 :
12 18 : bool variant_match::configure(const char* beg, const char* end, json::json_error& err)
13 : {
14 : typedef std::pair<const char*, const char*> field_pair_t;
15 : typedef std::vector< field_pair_t > pair_list_t;
16 : typedef json::vector_of< json::iterator_pair<field_pair_t> > pair_list_json;
17 18 : pair_list_t pair_list;
18 18 : pair_list_json::serializer()(pair_list, beg, end, &err);
19 18 : if (err)
20 0 : return false;
21 :
22 18 : _matchers.clear();
23 50 : for (auto p : pair_list)
24 : {
25 : // Передаем end, а не p.second, чтобы в случае ошибки получить правильное место где она
26 32 : auto m = _builder->build_value_nv(p.first, end, err);
27 32 : if ( m==nullptr || err ) return false;
28 32 : if (!m->configure(p.first, end, err))
29 0 : return false;
30 32 : _matchers.push_back(m);
31 32 : }
32 18 : return true;
33 : }
34 :
35 22 : bool variant_match::match(const char* beg, const char* end, json::json_error& err)
36 : {
37 22 : if ( _matchers.empty() )
38 0 : return true;
39 :
40 39 : for (auto m : _matchers)
41 : {
42 30 : if ( m->match(beg, end, err) )
43 13 : return true;
44 17 : }
45 9 : return false;
46 : }
47 :
48 :
49 : }}
|