diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/lib/formats/fsmeta.cpp | 40 | ||||
-rw-r--r-- | src/lib/formats/fsmeta.h | 2 | ||||
-rw-r--r-- | src/tools/floptool.cpp | 6 |
3 files changed, 31 insertions, 17 deletions
diff --git a/src/lib/formats/fsmeta.cpp b/src/lib/formats/fsmeta.cpp index 9ccb7e144b3..9c7143301ce 100644 --- a/src/lib/formats/fsmeta.cpp +++ b/src/lib/formats/fsmeta.cpp @@ -32,20 +32,34 @@ const char *meta_data::entry_name(meta_name name) return ""; } -std::string meta_value::to_string(meta_type type, const meta_value &m) +std::string meta_value::to_string() const { - switch(type) { - case meta_type::string: return m.as_string(); - case meta_type::number: return util::string_format("0x%x", m.as_number()); - case meta_type::flag: return m.as_flag() ? "t" : "f"; - case meta_type::date: { - auto dt = m.as_date(); - return util::string_format("%04d-%02d-%02d %02d:%02d:%02d", - dt.year, dt.month, dt.day_of_month, - dt.hour, dt.minute, dt.second); - } - } - return std::string(""); + std::string result; + + std::visit([this, &result](auto &&arg) + { + using T = std::decay_t<decltype(arg)>; + if constexpr (std::is_same_v<T, std::string>) + { + result = as_string(); + } + else if constexpr (std::is_same_v<T, uint64_t>) + { + result = util::string_format("0x%x", as_number()); + } + else if constexpr (std::is_same_v<T, bool>) + { + result = as_flag() ? "t" : "f"; + } + else if constexpr (std::is_same_v<T, util::arbitrary_datetime>) + { + auto dt = as_date(); + result = util::string_format("%04d-%02d-%02d %02d:%02d:%02d", + dt.year, dt.month, dt.day_of_month, + dt.hour, dt.minute, dt.second); + } + }, value); + return result; } } // namespace fs diff --git a/src/lib/formats/fsmeta.h b/src/lib/formats/fsmeta.h index 12ca8ef8e1a..4c1cefdc599 100644 --- a/src/lib/formats/fsmeta.h +++ b/src/lib/formats/fsmeta.h @@ -46,7 +46,7 @@ enum class meta_type { class meta_value { public: - static std::string to_string(meta_type type, const meta_value &m); + std::string to_string() const; static meta_value from_string(meta_type type, std::string value); meta_value() { value = false; } diff --git a/src/tools/floptool.cpp b/src/tools/floptool.cpp index 7abea32a90b..f68c4110edc 100644 --- a/src/tools/floptool.cpp +++ b/src/tools/floptool.cpp @@ -283,7 +283,7 @@ static void dir_scan(u32 depth, fs::filesystem_t::dir_t dir, std::vector<std::ve if(!meta.has(m.m_name)) continue; size_t slot = nmap.find(m.m_name)->second; - std::string val = fs::meta_value::to_string(m.m_type, meta.get(m.m_name)); + std::string val = meta.get(m.m_name).to_string(); if(slot == 0) val = head + "dir " + val; entries[id][slot] = val; @@ -301,7 +301,7 @@ static void dir_scan(u32 depth, fs::filesystem_t::dir_t dir, std::vector<std::ve if(!meta.has(m.m_name)) continue; size_t slot = nmap.find(m.m_name)->second; - std::string val = fs::meta_value::to_string(m.m_type, meta.get(m.m_name)); + std::string val = meta.get(m.m_name).to_string(); if(slot == 0) val = head + (c.m_type == fs::dir_entry_type::system_file ? "sys " : "file ") + val; entries[id][slot] = val; @@ -323,7 +323,7 @@ static int generic_dir(image_handler &ih) if(!vmeta.empty()) { std::string vinf = "Volume:"; for(const auto &e : vmetad) - vinf += util::string_format(" %s=%s", fs::meta_data::entry_name(e.m_name), fs::meta_value::to_string(e.m_type, vmeta.get(e.m_name))); + vinf += util::string_format(" %s=%s", fs::meta_data::entry_name(e.m_name), vmeta.get(e.m_name).to_string()); printf("%s\n\n", vinf.c_str()); } |