aboutsummaryrefslogtreecommitdiffstats
path: root/nihil.config/option.ccm
diff options
context:
space:
mode:
Diffstat (limited to 'nihil.config/option.ccm')
-rw-r--r--nihil.config/option.ccm105
1 files changed, 105 insertions, 0 deletions
diff --git a/nihil.config/option.ccm b/nihil.config/option.ccm
new file mode 100644
index 0000000..4b95793
--- /dev/null
+++ b/nihil.config/option.ccm
@@ -0,0 +1,105 @@
+/*
+ * This source code is released into the public domain.
+ */
+
+module;
+
+#include <expected>
+#include <iosfwd>
+#include <string>
+
+export module nihil.config:option;
+
+import nihil.error;
+import nihil.ucl;
+
+namespace nihil::config {
+
+/*
+ * Base class for options; this is what config_store interacts with.
+ *
+ * Base classes should override the four protected functions:
+ *
+ * get_string()
+ * set_string()
+ * get_ucl()
+ * set_ucl()
+ *
+ * Overriding any other members is not permitted.
+ */
+
+export struct option
+{
+ virtual ~option();
+
+ // Short name of this option.
+ [[nodiscard]] auto name(this option const &) noexcept
+ -> std::string_view;
+
+ // Human-readable description of this option.
+ [[nodiscard]] auto description(this option const &) noexcept
+ -> std::string_view;
+
+ // If true, this option is set to its default value.
+ [[nodiscard]] auto is_default(this option const &) noexcept
+ -> bool;
+
+ /*
+ * Get or set this option as a string. The specific conversion
+ * method depends on the derived option type.
+ */
+ [[nodiscard]] auto string(this option const &) -> std::string;
+ [[nodiscard]] auto string(this option &, std::string_view value)
+ -> std::expected<void, error>;
+
+ /*
+ * Return this object as a UCL object. This is used when writing the
+ * configuration file.
+ */
+ [[nodiscard]] auto ucl(this option const &)
+ -> std::expected<ucl::object, error>;
+
+ /*
+ * Set this object from a UCL object. This is used when reading the
+ * configuration file.
+ */
+ [[nodiscard]] auto ucl(this option &, ucl::object const &)
+ -> std::expected<void, error>;
+
+ // Not copyable or movable.
+ option(option const &) = delete;
+ auto operator=(option const &) -> option& = delete;
+
+protected:
+ option(std::string_view name, std::string_view description);
+
+ auto is_default(this option &, bool) -> void;
+
+ /*
+ * Get or set this option as a string.
+ */
+ [[nodiscard]] virtual auto get_string() const
+ -> std::string = 0;
+ [[nodiscard]] virtual auto set_string(std::string_view)
+ -> std::expected<void, error> = 0;
+
+ /*
+ * Get or set this option as a UCL object.
+ */
+ [[nodiscard]] virtual auto get_ucl() const
+ -> std::expected<ucl::object, error> = 0;
+ [[nodiscard]] virtual auto set_ucl(ucl::object const &)
+ -> std::expected<void, error> = 0;
+
+private:
+ std::string m_name;
+ std::string m_description;
+ bool m_is_default = true;
+};
+
+/*
+ * Make options printable. This is mostly useful for testing.
+ */
+export auto operator<<(std::ostream &strm, option const &opt) -> std::ostream &;
+
+} // namespace nihil