refactor(metadata): factor out dump() and json methods

This commit is contained in:
Marcus Holland-Moritz 2025-04-06 21:50:19 +02:00
parent eecf24acd8
commit 719588be13
3 changed files with 54 additions and 52 deletions

View File

@ -66,6 +66,8 @@ struct metadata_options;
namespace internal {
class metadata_v2_data;
class metadata_v2 {
public:
metadata_v2() = default;
@ -80,24 +82,6 @@ class metadata_v2 {
void check_consistency() const { impl_->check_consistency(); }
void
dump(std::ostream& os, fsinfo_options const& opts,
filesystem_info const* fsinfo,
std::function<void(std::string const&, uint32_t)> const& icb) const {
impl_->dump(os, opts, fsinfo, icb);
}
nlohmann::json info_as_json(fsinfo_options const& opts,
filesystem_info const* fsinfo) const {
return impl_->info_as_json(opts, fsinfo);
}
nlohmann::json as_json() const { return impl_->as_json(); }
std::string serialize_as_json(bool simple) const {
return impl_->serialize_as_json(simple);
}
size_t size() const { return impl_->size(); }
void walk(std::function<void(dir_entry_view)> const& func) const {
@ -189,24 +173,16 @@ class metadata_v2 {
return impl_->get_block_numbers_by_category(category);
}
metadata_v2_data const& internal_data() const {
return impl_->internal_data();
}
class impl {
public:
virtual ~impl() = default;
virtual void check_consistency() const = 0;
virtual void dump(
std::ostream& os, fsinfo_options const& opts,
filesystem_info const* fsinfo,
std::function<void(std::string const&, uint32_t)> const& icb) const = 0;
virtual nlohmann::json
info_as_json(fsinfo_options const& opts,
filesystem_info const* fsinfo) const = 0;
virtual nlohmann::json as_json() const = 0;
virtual std::string serialize_as_json(bool simple) const = 0;
virtual size_t size() const = 0;
virtual void
@ -263,12 +239,33 @@ class metadata_v2 {
virtual std::vector<size_t>
get_block_numbers_by_category(std::string_view category) const = 0;
virtual metadata_v2_data const& internal_data() const = 0;
};
private:
std::unique_ptr<impl> impl_;
};
class metadata_v2_utils {
public:
metadata_v2_utils(metadata_v2 const& meta);
void dump(std::ostream& os, fsinfo_options const& opts,
filesystem_info const* fsinfo,
std::function<void(std::string const&, uint32_t)> const& icb) const;
nlohmann::json
info_as_json(fsinfo_options const& opts, filesystem_info const* fsinfo) const;
nlohmann::json as_json() const;
std::string serialize_as_json(bool simple) const;
private:
metadata_v2_data const& data_;
};
} // namespace internal
} // namespace reader
} // namespace dwarfs

View File

@ -648,7 +648,7 @@ void filesystem_<LoggerPolicy>::dump(std::ostream& os,
history_.dump(os);
}
meta_.dump(
metadata_v2_utils(meta_).dump(
os, opts, get_info(opts), [&](std::string const& indent, uint32_t inode) {
std::error_code ec;
auto chunks = meta_.get_chunks(inode, ec);
@ -726,20 +726,20 @@ filesystem_<LoggerPolicy>::info_as_json(fsinfo_options const& opts) const {
}
}
info.update(meta_.info_as_json(opts, get_info(opts)));
info.update(metadata_v2_utils(meta_).info_as_json(opts, get_info(opts)));
return info;
}
template <typename LoggerPolicy>
nlohmann::json filesystem_<LoggerPolicy>::metadata_as_json() const {
return meta_.as_json();
return metadata_v2_utils(meta_).as_json();
}
template <typename LoggerPolicy>
std::string
filesystem_<LoggerPolicy>::serialize_metadata_as_json(bool simple) const {
return meta_.serialize_as_json(simple);
return metadata_v2_utils(meta_).serialize_as_json(simple);
}
template <typename LoggerPolicy>

View File

@ -2214,24 +2214,6 @@ class metadata_ final : public metadata_v2::impl {
data_.check_consistency(LOG_PROXY_ARG);
}
void dump(std::ostream& os, fsinfo_options const& opts,
filesystem_info const* fsinfo,
std::function<void(std::string const&, uint32_t)> const& icb)
const override {
data_.dump(os, opts, fsinfo, icb);
}
nlohmann::json info_as_json(fsinfo_options const& opts,
filesystem_info const* fsinfo) const override {
return data_.info_as_json(opts, fsinfo);
}
nlohmann::json as_json() const override { return data_.as_json(); }
std::string serialize_as_json(bool simple) const override {
return data_.serialize_as_json(simple);
}
size_t size() const override { return data_.size(); }
void walk(std::function<void(dir_entry_view)> const& func) const override {
@ -2357,11 +2339,34 @@ class metadata_ final : public metadata_v2::impl {
return data_.get_block_numbers_by_category(category);
}
metadata_v2_data const& internal_data() const override { return data_; }
private:
LOG_PROXY_DECL(LoggerPolicy);
metadata_v2_data const data_;
};
metadata_v2_utils::metadata_v2_utils(metadata_v2 const& meta)
: data_{meta.internal_data()} {}
void metadata_v2_utils::dump(
std::ostream& os, fsinfo_options const& opts, filesystem_info const* fsinfo,
std::function<void(std::string const&, uint32_t)> const& icb) const {
data_.dump(os, opts, fsinfo, icb);
}
nlohmann::json
metadata_v2_utils::info_as_json(fsinfo_options const& opts,
filesystem_info const* fsinfo) const {
return data_.info_as_json(opts, fsinfo);
}
nlohmann::json metadata_v2_utils::as_json() const { return data_.as_json(); }
std::string metadata_v2_utils::serialize_as_json(bool simple) const {
return data_.serialize_as_json(simple);
}
metadata_v2::metadata_v2(
logger& lgr, std::span<uint8_t const> schema, std::span<uint8_t const> data,
metadata_options const& options, int inode_offset,