draconisplusplus/src/os/serenity/package.cpp
2025-05-04 18:05:06 -04:00

39 lines
1.1 KiB
C++

#ifdef __serenity__
// clang-format off
#include "src/core/package.hpp"
#include <fstream>
#include <unordered_set>
#include "src/util/defs.hpp"
#include "src/util/error.hpp"
#include "src/util/types.hpp"
// clang-format on
using util::error::DracError, util::error::DracErrorCode;
using util::types::u64, util::types::String, util::types::Result, util::types::Err;
namespace {
fn CountUniquePackages(const String& dbPath) -> Result<u64, DracError> {
std::ifstream dbFile(dbPath);
if (!dbFile.is_open())
return Err(DracError(DracErrorCode::NotFound, std::format("Failed to open file: {}", dbPath)));
std::unordered_set<String> uniquePackages;
String line;
while (std::getline(dbFile, line))
if (line.starts_with("manual ") || line.starts_with("auto "))
uniquePackages.insert(line);
return uniquePackages.size();
}
} // namespace
namespace package {
fn GetSerenityCount() -> Result<u64, DracError> { return CountUniquePackages("/usr/Ports/installed.db"); }
} // namespace package
#endif // __serenity__