summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoman Smrž <roman.smrz@seznam.cz>2020-01-27 21:56:06 +0100
committerRoman Smrž <roman.smrz@seznam.cz>2020-02-05 21:02:08 +0100
commit495d2cb6b47b309070b31e0ef83fa5731a150a6d (patch)
treedddf94ae3513409d2e80801b085686cf88c760a5
parentab86a1f0c3b86050e65fc5b7ac1e88a00f0d228c (diff)
Storage: handle record items with unknown type
-rw-r--r--include/erebos/storage.h10
-rw-r--r--src/storage.cpp14
2 files changed, 22 insertions, 2 deletions
diff --git a/include/erebos/storage.h b/include/erebos/storage.h
index d855460..d23022f 100644
--- a/include/erebos/storage.h
+++ b/include/erebos/storage.h
@@ -160,12 +160,19 @@ class RecordT
public:
class Item {
public:
+ struct UnknownType
+ {
+ std::string type;
+ std::string value;
+ };
+
typedef std::variant<
std::monostate,
int,
std::string,
std::vector<uint8_t>,
- typename S::Ref> Variant;
+ typename S::Ref,
+ UnknownType> Variant;
Item(const std::string & name):
Item(name, std::monostate()) {}
@@ -184,6 +191,7 @@ public:
std::optional<std::string> asText() const;
std::optional<std::vector<uint8_t>> asBinary() const;
std::optional<typename S::Ref> asRef() const;
+ std::optional<UnknownType> asUnknown() const;
template<typename T> std::optional<Stored<T>> as() const;
diff --git a/src/storage.cpp b/src/storage.cpp
index 6b2e4f8..db9f629 100644
--- a/src/storage.cpp
+++ b/src/storage.cpp
@@ -574,6 +574,14 @@ optional<typename S::Ref> RecordT<S>::Item::asRef() const
return nullopt;
}
+template<class S>
+optional<typename RecordT<S>::Item::UnknownType> RecordT<S>::Item::asUnknown() const
+{
+ if (holds_alternative<typename Item::UnknownType>(value))
+ return std::get<typename Item::UnknownType>(value);
+ return nullopt;
+}
+
template<class S>
RecordT<S>::RecordT(const vector<Item> & from):
@@ -625,7 +633,8 @@ optional<RecordT<S>> RecordT<S>::decode(const S & st,
items->emplace_back(name, st.ref(Digest(value)));
}
} else
- throw runtime_error("unknown record item type");
+ items->emplace_back(name,
+ typename Item::UnknownType { type, value });
begin = newline + 1;
}
@@ -696,6 +705,9 @@ vector<uint8_t> RecordT<S>::encodeInner() const
} else if (auto x = item.asRef()) {
type = "r.b2";
value = string(x->digest());
+ } else if (auto x = item.asUnknown()) {
+ type = x->type;
+ value = x->value;
} else {
throw runtime_error("unhandeled record item type");
}