LCOV - code coverage report
Current view: top level - inc - errors.h (source / functions) Coverage Total Hit
Test: coverage.info Lines: 45.5 % 66 30
Test Date: 2025-04-18 15:53:49 Functions: 100.0 % 7 7

            Line data    Source code
       1              : #ifndef NICOLE_ERRORS_H
       2              : #define NICOLE_ERRORS_H
       3              : 
       4              : #include <expected>
       5              : #include <ostream>
       6              : 
       7              : namespace nicole {
       8              : 
       9              : enum class ERROR_TYPE {
      10              :   // Options
      11              :   MISSING_ARGUMENTS,
      12              :   MISSING_BINARY_NAME,
      13              :   MISSING_ENTRY_FILE,
      14              :   ENTRY_FILE_NOT_FOUND,
      15              :   UNKOWN_ARGUMENT,
      16              : 
      17              :   // Lexer
      18              :   CHECK_UNMATCHED,
      19              :   FILE_EXTENSION,
      20              :   FILE_NOT_OPEN,
      21              : 
      22              :   // TokeStream
      23              :   EAT,
      24              :   CURRENT,
      25              :   LOOK_AHEAD,
      26              :   LAST_READ,
      27              :   IS_CURRENT_TOKEN_TYPE,
      28              :   INSERT_AFTER,
      29              : 
      30              :   BUILDER,
      31              : 
      32              :   SINTAX,
      33              : 
      34              :   NULL_NODE,
      35              : 
      36              :   ENUM,
      37              :   VARIABLE,
      38              :   TYPE,
      39              :   FUNCTION,
      40              :   METHOD,
      41              :   ATTR,
      42              : 
      43              :   PRINT_TREE,
      44              :   VALIDATE_TREE
      45              : };
      46              : 
      47           63 : [[nodiscard]] inline std::string errorToStr(const ERROR_TYPE type) noexcept {
      48           63 :   switch (type) {
      49              :   // Options
      50            9 :   case ERROR_TYPE::MISSING_ARGUMENTS:
      51            9 :     return "MISSING_ARGUMENTS";
      52            9 :   case ERROR_TYPE::MISSING_BINARY_NAME:
      53            9 :     return "MISSING_BINARY_NAME";
      54            0 :   case ERROR_TYPE::MISSING_ENTRY_FILE:
      55            0 :     return "MISSING_ENTRY_FILE";
      56            9 :   case ERROR_TYPE::ENTRY_FILE_NOT_FOUND:
      57            9 :     return "ENTRY_FILE_NOT_FOUND";
      58            0 :   case ERROR_TYPE::UNKOWN_ARGUMENT:
      59            0 :     return "UNKOWN_ARGUMENT";
      60              : 
      61              :   // Lexer
      62            9 :   case ERROR_TYPE::CHECK_UNMATCHED:
      63            9 :     return "CHECK_UNMATCHED";
      64            9 :   case ERROR_TYPE::FILE_EXTENSION:
      65            9 :     return "FILE_EXTENSION";
      66            0 :   case ERROR_TYPE::FILE_NOT_OPEN:
      67            0 :     return "FILE_NOT_OPEN";
      68              : 
      69              :   // TokeStream
      70            9 :   case ERROR_TYPE::EAT:
      71            9 :     return "EAT";
      72            0 :   case ERROR_TYPE::CURRENT:
      73            0 :     return "CURRENT";
      74            9 :   case ERROR_TYPE::LOOK_AHEAD:
      75            9 :     return "LOOK_AHEAD";
      76            0 :   case ERROR_TYPE::LAST_READ:
      77            0 :     return "LAST_READ";
      78            0 :   case ERROR_TYPE::IS_CURRENT_TOKEN_TYPE:
      79            0 :     return "IS_CURRENT_TOKEN_TYPE";
      80            0 :   case ERROR_TYPE::INSERT_AFTER:
      81            0 :     return "INSERT_AFTER";
      82              : 
      83            0 :   case ERROR_TYPE::BUILDER:
      84            0 :     return "BUILDER";
      85              : 
      86            0 :   case ERROR_TYPE::SINTAX:
      87            0 :     return "SINTAX";
      88              : 
      89            0 :   case ERROR_TYPE::NULL_NODE:
      90            0 :     return "NULL_NODE";
      91              : 
      92            0 :   case ERROR_TYPE::ENUM:
      93            0 :     return "ENUM";
      94              : 
      95            0 :   case ERROR_TYPE::TYPE:
      96            0 :     return "TYPE";
      97              : 
      98            0 :   case ERROR_TYPE::VARIABLE:
      99            0 :     return "VARIABLE";
     100              : 
     101            0 :   case ERROR_TYPE::FUNCTION:
     102            0 :     return "FUNCTION";
     103              : 
     104            0 :   case ERROR_TYPE::METHOD:
     105            0 :     return "METHOD";
     106              : 
     107            0 :   case ERROR_TYPE::ATTR:
     108            0 :     return "ATTR";
     109              : 
     110            0 :   case ERROR_TYPE::PRINT_TREE:
     111            0 :     return "PRINT_TREE";
     112              : 
     113            0 :   case ERROR_TYPE::VALIDATE_TREE:
     114            0 :     return "VALIDATE_TREE";
     115           63 :   }
     116           63 : }
     117              : 
     118              : class Error final {
     119              : private:
     120              :   ERROR_TYPE type_;
     121              :   std::string info_;
     122              : 
     123              : public:
     124              :   explicit Error(const ERROR_TYPE type, const std::string &info) noexcept
     125          198 :       : type_{type}, info_{info} {}
     126              : 
     127          135 :   [[nodiscard]] ERROR_TYPE type() const noexcept { return type_; }
     128              : 
     129           63 :   [[nodiscard]] const std::string &info() const noexcept { return info_; }
     130              : 
     131              :   friend std::ostream &operator<<(std::ostream &os,
     132           63 :                                   const Error &error) noexcept {
     133           63 :     return os << "Error " << errorToStr(error.type_) << ": " << error.info_;
     134           63 :   }
     135              : };
     136              : 
     137              : [[nodiscard]] inline std::unexpected<Error> createError(const ERROR_TYPE type,
     138          135 :                                 const std::string &info) noexcept {
     139          135 :   return std::unexpected{Error{type, info}};
     140          135 : }
     141              : 
     142           27 : [[nodiscard]] inline std::unexpected<Error> createError(const Error &error) noexcept {
     143           27 :   return std::unexpected{error};
     144           27 : }
     145              : 
     146              : } // namespace nicole
     147              : 
     148              : #endif
        

Generated by: LCOV version 2.0-1