summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorDan Goodliffe <dan@randomdan.homeip.net>2021-04-25 19:39:26 +0100
committerDan Goodliffe <dan@randomdan.homeip.net>2021-11-07 16:41:37 +0000
commit8e8d707db19c12ffa7c018206ebe2582f0d86355 (patch)
tree68f9c54942730729db671286862247e8d3b42a82 /lib
parentErring toward complete JSON loader (diff)
downloadilt-8e8d707db19c12ffa7c018206ebe2582f0d86355.tar.bz2
ilt-8e8d707db19c12ffa7c018206ebe2582f0d86355.tar.xz
ilt-8e8d707db19c12ffa7c018206ebe2582f0d86355.zip
Support chaining persist calls for subclasses
Diffstat (limited to 'lib')
-rw-r--r--lib/persistance.h11
1 files changed, 7 insertions, 4 deletions
diff --git a/lib/persistance.h b/lib/persistance.h
index 7f28ad1..0082d4c 100644
--- a/lib/persistance.h
+++ b/lib/persistance.h
@@ -59,8 +59,8 @@ namespace Persistanace {
struct PersistanceStore {
// virtual bool persistType(const std::type_info &) = 0;
template<typename T>
- bool
- persistValue(const std::string_view & key, T & value)
+ inline bool
+ persistValue(const std::string_view key, T & value)
{
if (key == name) {
sel = std::make_unique<SelectionT<T>>(std::ref(value));
@@ -115,7 +115,7 @@ namespace Persistanace {
virtual ~Persistable() = default;
DEFAULT_MOVE_COPY(Persistable);
- virtual void persist(PersistanceStore & store) = 0;
+ virtual bool persist(PersistanceStore & store) = 0;
static void addFactory(const std::string_view, std::function<std::unique_ptr<Persistable>()>);
static std::unique_ptr<Persistable> callFactory(const std::string_view);
@@ -166,7 +166,9 @@ namespace Persistanace {
}
}
PersistanceStore ps {mbr};
- v->persist(ps);
+ if (v->persist(ps)) {
+ throw std::runtime_error("cannot find member: " + mbr);
+ }
return std::move(ps.sel);
}
}
@@ -206,6 +208,7 @@ namespace Persistanace {
{
stk.push(std::make_unique<SelectionObj>(v));
}
+
void
EndObject(Stack & stk) override
{