LCOV - code coverage report
Current view: top level - lib/FangFeedParser - FeedParser.cpp (source / functions) Coverage Total Hit
Test: coverage.info.cleaned Lines: 90.0 % 30 27
Test Date: 2026-04-19 00:35:54 Functions: 100.0 % 3 3

            Line data    Source code
       1              : #include "FeedParser.h"
       2              : 
       3              : #include "RawFeed.h"
       4              : #include "RSSAtomParser.h"
       5              : #include "JSONFeedParser.h"
       6              : 
       7          106 : FeedParseResult FeedParser::parse(const QByteArray& data)
       8              : {
       9          106 :     if (data.trimmed().isEmpty()) {
      10            2 :         return FeedParseResult::failure(FeedParseError::EmptyInput);
      11              :     }
      12              : 
      13          104 :     if (looksLikeJSON(data)) {
      14           10 :         auto feed = JSONFeedParser::parse(data);
      15           10 :         if (feed) {
      16            9 :             return FeedParseResult::success(std::move(feed));
      17              :         }
      18              : 
      19              :         // Couldn't parse JSON, maybe it's RSS/Atom?
      20            1 :         return parseXML(data);
      21           10 :     }
      22              : 
      23           94 :     FeedParseResult xmlResult = parseXML(data);
      24           94 :     if (xmlResult.ok()) {
      25           93 :         return xmlResult;
      26              :     }
      27              : 
      28              :     // RSS/Atom parser failed, try JSON parser as fallback.
      29            1 :     auto feed = JSONFeedParser::parse(data);
      30            1 :     if (feed) {
      31            1 :         return FeedParseResult::success(std::move(feed));
      32              :     }
      33              : 
      34              :     // We tried. *shrugs*
      35            0 :     return xmlResult;
      36           94 : }
      37              : 
      38          104 : bool FeedParser::looksLikeJSON(const QByteArray& data)
      39              : {
      40          104 :     for (int i = 0; i < data.size(); ++i) {
      41          104 :         char ch = data.at(i);
      42          104 :         if (ch == ' ' || ch == '\t' || ch == '\n' || ch == '\r') {
      43            0 :             continue;
      44              :         }
      45          104 :         return ch == '{';
      46              :     }
      47            0 :     return false;
      48              : }
      49              : 
      50           95 : FeedParseResult FeedParser::parseXML(const QByteArray& data)
      51              : {
      52           95 :     auto feed = RSSAtomParser::parse(data);
      53           95 :     if (feed) {
      54           93 :         return FeedParseResult::success(std::move(feed));
      55              :     }
      56            2 :     return FeedParseResult::failure(FeedParseError::MalformedXML);
      57           95 : }
        

Generated by: LCOV version 2.0-1