refactor: use file_access for fragment order parser

This commit is contained in:
Marcus Holland-Moritz 2025-04-08 13:12:12 +02:00
parent f2fc5f3389
commit 179948e0cc
3 changed files with 23 additions and 8 deletions

View File

@ -28,14 +28,25 @@
#include <dwarfs/writer/fragment_order_options.h>
namespace dwarfs::writer {
namespace dwarfs {
class file_access;
namespace writer {
struct fragment_order_parser {
public:
static std::string choices();
fragment_order_parser(std::shared_ptr<file_access const> const& fa)
: fa_{fa} {}
fragment_order_options parse(std::string_view arg) const;
std::string to_string(fragment_order_options const& opts) const;
private:
std::shared_ptr<file_access const> fa_;
};
} // namespace dwarfs::writer
} // namespace writer
} // namespace dwarfs

View File

@ -33,6 +33,7 @@
#include <range/v3/view/join.hpp>
#include <range/v3/view/map.hpp>
#include <dwarfs/file_access.h>
#include <dwarfs/option_map.h>
#include <dwarfs/writer/fragment_order_parser.h>
@ -99,13 +100,16 @@ fragment_order_parser::parse(std::string_view arg) const {
case fragment_order_mode::EXPLICIT: {
auto file = om.get<std::string>("file");
std::ifstream ifs{file};
if (!ifs) {
throw std::runtime_error(
fmt::format("failed to open explicit order file '{}'", file));
std::error_code ec;
auto input = fa_->open_input(file, ec);
if (ec) {
throw std::runtime_error(fmt::format(
"failed to open explicit order file '{}': {}", file, ec.message()));
}
std::string line;
while (std::getline(ifs, line)) {
while (std::getline(input->is(), line)) {
auto const path = std::filesystem::path{line}.relative_path();
rv.explicit_order[path] = rv.explicit_order.size();
}

View File

@ -414,7 +414,7 @@ int mkdwarfs_main(int argc, sys_char** argv, iolayer const& iol) {
integral_value_parser<unsigned> window_size_parser(0, 24);
integral_value_parser<unsigned> window_step_parser(0, 8);
integral_value_parser<unsigned> bloom_filter_size_parser(0, 10);
writer::fragment_order_parser order_parser;
writer::fragment_order_parser order_parser(iol.file);
block_compressor_parser compressor_parser;
writer::scanner_options options;