LCOV - code coverage report
Current view: top level - include - parser.hpp (source / functions) Coverage Total Hit
Test: JSON Expression Parser Lines: 100.0 % 14 14
Test Date: 2024-11-04 20:34:32 Functions: 100.0 % 3 3
Branches: 73.3 % 30 22

             Branch data     Line data    Source code
       1                 :             : /*
       2                 :             :  * The MIT License (MIT)
       3                 :             :  *
       4                 :             :  * Copyright (c) 2024 Yaroslav Riabtsev <yaroslav.riabtsev@rwth-aachen.de>
       5                 :             :  *
       6                 :             :  * Permission is hereby granted, free of charge, to any person obtaining a copy
       7                 :             :  * of this software and associated documentation files (the "Software"), to deal
       8                 :             :  * in the Software without restriction, including without limitation the rights
       9                 :             :  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
      10                 :             :  * copies of the Software, and to permit persons to whom the Software is
      11                 :             :  * furnished to do so, subject to the following conditions:
      12                 :             :  *
      13                 :             :  * The above copyright notice and this permission notice shall be included
      14                 :             :  * in all copies or substantial portions of the Software.
      15                 :             :  *
      16                 :             :  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
      17                 :             :  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
      18                 :             :  * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE
      19                 :             :  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
      20                 :             :  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
      21                 :             :  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
      22                 :             :  * SOFTWARE.
      23                 :             :  */
      24                 :             : 
      25                 :             : #ifndef PARSER_HPP
      26                 :             : #define PARSER_HPP
      27                 :             : #include "reference.hpp"
      28                 :             : 
      29                 :             : #include <filesystem>
      30                 :             : #include <fstream>
      31                 :             : #include <functional>
      32                 :             : 
      33                 :             : namespace parser_lib {
      34                 :             : class parser {
      35                 :             : public:
      36                 :             :     explicit parser(std::string& buffer);
      37                 :             :     explicit parser(const std::stringstream& ss);
      38                 :             :     explicit parser(std::ifstream& is);
      39                 :             :     explicit parser(const std::filesystem::path& path);
      40                 :             : 
      41                 :             :     void completely_parse_json(
      42                 :             :         std::shared_ptr<json_lib::json>& result, bool dynamic = false
      43                 :             :     );
      44                 :             : 
      45                 :             : private:
      46                 :             :     std::ifstream ifs;
      47                 :             :     std::string buffer;
      48                 :             :     int pos { -1 };
      49                 :             :     int line { -1 };
      50                 :             : 
      51                 :             :     size_t get_pos() const;
      52                 :             :     bool valid() const;
      53                 :             :     void next();
      54                 :             :     void read_line();
      55                 :             :     char peek() const;
      56                 :             :     char get();
      57                 :             :     bool check_ahead(char expected) const;
      58                 :             :     bool separator(char val = ',');
      59                 :             : 
      60                 :             :     void nonessential();
      61                 :             :     std::string parse_keyword();
      62                 :             :     std::string parse_string();
      63                 :             :     std::tuple<std::string, bool> parse_number();
      64                 :             : 
      65                 :             :     template <typename Container, typename ParseElement>
      66                 :             :     Container
      67                 :             :     parse_collection(bool dynamic, char halt, ParseElement parse_element);
      68                 :             :     void parse_array_item(
      69                 :             :         std::vector<std::shared_ptr<json_lib::json>>& children, bool dynamic
      70                 :             :     );
      71                 :             :     void parse_set_item(
      72                 :             :         std::vector<std::shared_ptr<reference_lib::json_reference>>& children,
      73                 :             :         bool dynamic
      74                 :             :     );
      75                 :             :     void parse_object_item(
      76                 :             :         std::vector<std::pair<std::string, std::shared_ptr<json_lib::json>>>&
      77                 :             :             children,
      78                 :             :         bool dynamic
      79                 :             :     );
      80                 :             : 
      81                 :             :     bool parse_accessor(std::shared_ptr<json_lib::json>& accessor);
      82                 :             :     void parse_tail(const std::shared_ptr<reference_lib::json_reference>& result
      83                 :             :     );
      84                 :             :     void parse_reference(std::shared_ptr<json_lib::json>& result);
      85                 :             :     void parse_json(std::shared_ptr<json_lib::json>& result, bool dynamic);
      86                 :             : 
      87                 :             :     std::runtime_error throw_message(
      88                 :             :         const std::string& message,
      89                 :             :         std::source_location location = std::source_location::current()
      90                 :             :     ) const;
      91                 :             : };
      92                 :             : 
      93                 :             : template <typename Container, typename ParseElement>
      94                 :        2452 : Container parser::parse_collection(
      95                 :             :     const bool dynamic, const char halt, ParseElement parse_element
      96                 :             : ) {
      97                 :        2452 :     Container children;
      98         [ +  - ]:        2452 :     nonessential();
      99                 :        2452 :     bool closed = true;
     100   [ +  +  +  +  :       15598 :     while (valid() && peek() != halt) {
                   +  + ]
     101         [ +  + ]:       13159 :         std::invoke(parse_element, *this, children, dynamic);
     102         [ +  - ]:       13146 :         closed = !separator();
     103                 :             :     }
     104         [ +  + ]:        2439 :     if (!closed) {
     105   [ +  -  +  - ]:           6 :         throw throw_message("expected one more item in enumerator");
     106                 :             :     }
     107   [ +  +  -  +  :        2437 :     if (!valid() || peek() != halt) {
                   +  + ]
     108   [ +  -  +  - ]:          18 :         throw throw_message("enumerator-object is not closed");
     109                 :             :     }
     110         [ +  - ]:        2431 :     next();
     111                 :        2431 :     return children;
     112                 :          21 : }
     113                 :             : }
     114                 :             : 
     115                 :             : #endif // PARSER_HPP
        

Generated by: LCOV version 2.0-1