diff options
Diffstat (limited to 'nihil.config/option.ccm')
| -rw-r--r-- | nihil.config/option.ccm | 105 |
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 |
