/* * This source code is released into the public domain. */ module; #include #include #include 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; /* * Return this object as a UCL object. This is used when writing the * configuration file. */ [[nodiscard]] auto ucl(this option const &) -> std::expected; /* * 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; // 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 = 0; /* * Get or set this option as a UCL object. */ [[nodiscard]] virtual auto get_ucl() const -> std::expected = 0; [[nodiscard]] virtual auto set_ucl(ucl::object const &) -> std::expected = 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