summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/formats/fsmeta.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/formats/fsmeta.cpp')
-rw-r--r--src/lib/formats/fsmeta.cpp61
1 files changed, 60 insertions, 1 deletions
diff --git a/src/lib/formats/fsmeta.cpp b/src/lib/formats/fsmeta.cpp
index d10064bb162..f3e91e706a0 100644
--- a/src/lib/formats/fsmeta.cpp
+++ b/src/lib/formats/fsmeta.cpp
@@ -35,6 +35,16 @@ const char *meta_data::entry_name(meta_name name)
return "";
}
+std::optional<meta_name> meta_data::from_entry_name(const char *name)
+{
+ for (int i = 0; i <= (int)meta_name::max; i++)
+ {
+ if (!strcmp(name, entry_name((meta_name)i)))
+ return (meta_name)i;
+ }
+ return {};
+}
+
template <class... Ts> struct overloaded : Ts... { using Ts::operator()...; };
template <class... Ts> overloaded(Ts...) -> overloaded<Ts...>;
@@ -51,7 +61,41 @@ meta_type meta_value::type() const
return *result;
}
-std::string meta_value::to_string() const
+util::arbitrary_datetime meta_value::as_date() const
+{
+ util::arbitrary_datetime result = { 0, };
+
+ std::visit(
+ overloaded
+ {
+ [&result](const std::string &s)
+ {
+ sscanf(s.c_str(), "%d-%d-%d %d:%d:%d", &result.year, &result.month, &result.day_of_month, &result.hour, &result.minute, &result.second);
+ },
+ [&result](const util::arbitrary_datetime &dt) { result = dt; },
+ [](std::uint64_t) { /* nonsensical */ },
+ [](bool) { /* nonsensical */ }
+ }, value);
+
+ return result;
+}
+
+bool meta_value::as_flag() const
+{
+ bool result = false;
+
+ std::visit(
+ overloaded
+ {
+ [&result](const std::string &s) { result = !s.empty() && s != "f"; },
+ [&result](bool b) { result = b; },
+ [](std::uint64_t) { /* nonsensical */ },
+ [](const util::arbitrary_datetime &) { /* nonsensical */ }
+ }, value);
+ return result;
+}
+
+std::string meta_value::as_string() const
{
std::string result;
std::visit(
@@ -69,4 +113,19 @@ std::string meta_value::to_string() const
return result;
}
+uint64_t meta_value::as_number() const
+{
+ uint64_t result = 0;
+
+ std::visit(overloaded
+ {
+ [&result](const std::string &s) { result = std::stoull(s); },
+ [&result](uint64_t i) { result = i; },
+ [](const util::arbitrary_datetime &) { /* nonsensical */ },
+ [](bool) { /* nonsensical */ }
+ }, value);
+ return result;
+}
+
+
} // namespace fs