aboutsummaryrefslogtreecommitdiffstats
path: root/nihil.config/write.cc
diff options
context:
space:
mode:
authorLexi Winter <lexi@le-fay.org>2025-06-23 19:45:54 +0100
committerLexi Winter <lexi@le-fay.org>2025-06-23 19:45:54 +0100
commit2a3f19ff67bd0292a2812993b2b19c292d113959 (patch)
tree81fa477e6c1470f77a3ddd12ee5804c7a315f2c3 /nihil.config/write.cc
parent504c02086832dcaab5cfa042ee7a488470284424 (diff)
downloadnihil-2a3f19ff67bd0292a2812993b2b19c292d113959.tar.gz
nihil-2a3f19ff67bd0292a2812993b2b19c292d113959.tar.bz2
config: add separate implementation for read, write
Diffstat (limited to 'nihil.config/write.cc')
-rw-r--r--nihil.config/write.cc39
1 files changed, 39 insertions, 0 deletions
diff --git a/nihil.config/write.cc b/nihil.config/write.cc
new file mode 100644
index 0000000..4b2a232
--- /dev/null
+++ b/nihil.config/write.cc
@@ -0,0 +1,39 @@
+/*
+ * This source code is released into the public domain.
+ */
+
+module;
+
+#include <filesystem>
+#include <format>
+#include <utility>
+
+import nihil;
+import nihil.ucl;
+
+module nihil.config;
+
+namespace nihil::config {
+
+auto write_to(std::filesystem::path const &filename) -> void
+try {
+ auto uclconfig = ucl::map<ucl::object>();
+
+ // Add all the options to the UCL object.
+ for (auto const &option : store::get().all()) {
+ if (option.is_default())
+ continue;
+
+ uclconfig.insert({option.name(), option.to_ucl()});
+ }
+
+ auto ucl_text = std::format("{:c}", uclconfig);
+ auto ret = safe_write_file(filename, ucl_text);
+ if (!ret)
+ throw error(std::format("{}: {}", filename.string(),
+ ret.error().message()));
+} catch (ucl::error const &exc) {
+ throw error(std::format("{}: {}", filename.string(), exc.what()));
+}
+
+};