diff options
Diffstat (limited to 'liblfvm/serialize.ccm')
| -rw-r--r-- | liblfvm/serialize.ccm | 26 |
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 |
