aboutsummaryrefslogtreecommitdiffstats
path: root/liblfvm/serialize.ccm
diff options
context:
space:
mode:
Diffstat (limited to 'liblfvm/serialize.ccm')
-rw-r--r--liblfvm/serialize.ccm26
1 files changed, 23 insertions, 3 deletions
diff --git a/liblfvm/serialize.ccm b/liblfvm/serialize.ccm
index 340f565..2144225 100644
--- a/liblfvm/serialize.ccm
+++ b/liblfvm/serialize.ccm
@@ -65,7 +65,7 @@ export [[nodiscard]] auto deserialize(std::string_view text)
else
co_return std::unexpected(nihil::error("missing name"));
- auto vm = vm_config(name);
+ auto vm = co_await make_vm_config(name);
// UUID
if (auto o = uobj.find("uuid"); o) {
@@ -80,12 +80,16 @@ export [[nodiscard]] auto deserialize(std::string_view text)
// ncpus
if (auto o = uobj.find("ncpus"); o) {
auto n = co_await object_cast<integer>(*o);
- vm.ncpus(n.value());
+ if (auto ok = vm.ncpus(n.value()); !ok)
+ co_return std::unexpected(nihil::error(
+ "invalid ncpus", ok.error()));
}
if (auto o = uobj.find("memory"); o) {
auto n = co_await object_cast<integer>(*o);
- vm.memory_size(n.value());
+ if (auto ok = vm.memory_size(n.value()); !ok)
+ co_return std::unexpected(nihil::error(
+ "invalid memory size", ok.error()));
}
if (auto o = uobj.find("destroy_on_poweroff"); o) {
@@ -167,4 +171,20 @@ export [[nodiscard]] auto vm_create(context const &ctx,
co_return {};
}
+/*
+ * Save an existing VM to disk.
+ */
+export [[nodiscard]] auto vm_save(context const &ctx,
+ vm_config const &config)
+ -> std::expected<void, nihil::error>
+{
+ auto ucltext = co_await serialize(config);
+ auto filename = ctx.vm_config_file(config.name());
+
+ co_await nihil::safe_write_file(filename, ucltext);
+
+ // TODO: Perhaps sync the file?
+ co_return {};
+}
+
} // namespace lfvm