// This source code is released into the public domain. export module nihil.core:errc; import nihil.std; namespace nihil { export enum struct errc : std::uint8_t { no_error = 0, /////////////////////////////////////////////////////////////// // nihil.command incomplete_command, /////////////////////////////////////////////////////////////// // nihil.ucl failed_to_create_object, type_mismatch, /////////////////////////////////////////////////////////////// // nihil.util // Empty string is not allowed. empty_string, // Invalid unit, e.g. in parse_size() invalid_unit, }; struct nihil_error_category final : std::error_category { [[nodiscard]] auto name() const noexcept -> char const * override { return "nihil"; } [[nodiscard]] auto message(int err) const -> std::string override { switch (static_cast(err)) { case errc::no_error: return "No error"; case errc::incomplete_command: return "Incomplete command"; case errc::empty_string: return "Empty string is not permitted"; case errc::invalid_unit: return "Invalid unit specifier"; case errc::failed_to_create_object: return "Failed to create UCL object"; case errc::type_mismatch: return "UCL type does not match expected type"; default: return "Undefined error"; } } }; export [[nodiscard]] auto nihil_category() noexcept -> std::error_category & { static auto category = nihil_error_category(); return category; } export [[nodiscard]] auto make_error_condition(errc ec) -> std::error_condition { return {static_cast(ec), nihil_category()}; } } // namespace nihil export template <> struct std::is_error_condition_enum : std::true_type { };