From 6cf5244bc514042fe419fffe1cd26a7f5e3c778f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Roman=20Smr=C5=BE?= Date: Thu, 16 Apr 2020 21:42:45 +0200 Subject: Remove optional from load result Makes loading of data well-defined for arbitrary object contents. Introduce zero reference and object to represent missing or mismatched parts. --- src/identity.cpp | 45 ++++++++++++++++++++++----------------------- 1 file changed, 22 insertions(+), 23 deletions(-) (limited to 'src/identity.cpp') diff --git a/src/identity.cpp b/src/identity.cpp index 3cba97c..2396b9f 100644 --- a/src/identity.cpp +++ b/src/identity.cpp @@ -24,12 +24,8 @@ optional Identity::load(const vector & refs) vector>> data; data.reserve(refs.size()); - for (const auto & ref : refs) { - auto d = Stored>::load(ref); - if (!d) - return nullopt; - data.push_back(*d); - } + for (const auto & ref : refs) + data.push_back(Stored>::load(ref)); if (auto ptr = Priv::validate(data)) return Identity(ptr); @@ -124,27 +120,30 @@ void Identity::Builder::owner(const Identity & val) p->owner.emplace(val); } -optional IdentityData::load(const Ref & ref) +IdentityData IdentityData::load(const Ref & ref) { - auto rec = ref->asRecord(); - if (!rec) - return nullopt; - - vector>> prev; - for (auto p : rec->items("SPREV")) - if (const auto & x = p.as>()) - prev.push_back(x.value()); + if (auto rec = ref->asRecord()) { + vector>> prev; + for (auto p : rec->items("SPREV")) + if (const auto & x = p.as>()) + prev.push_back(x.value()); - auto keyIdentity = rec->item("key-id").as(); - if (!keyIdentity) - return nullopt; + if (auto keyIdentity = rec->item("key-id").as()) + return IdentityData { + .prev = std::move(prev), + .name = rec->item("name").asText(), + .owner = rec->item("owner").as>(), + .keyIdentity = keyIdentity.value(), + .keyMessage = rec->item("key-msg").as(), + }; + } return IdentityData { - .prev = std::move(prev), - .name = rec->item("name").asText(), - .owner = rec->item("owner").as>(), - .keyIdentity = keyIdentity.value(), - .keyMessage = rec->item("key-msg").as(), + .prev = {}, + .name = nullopt, + .owner = nullopt, + .keyIdentity = Stored::load(ref.storage().zref()), + .keyMessage = nullopt, }; } -- cgit v1.2.3