#pragma once #include #include #include #include #include #include #include namespace web { /** * @brief The requirements of a resolver */ template concept SomeResolver = requires(T t) { std::is_default_constructible_v; { t.resolve(std::string_view{}, std::string_view{}) } -> std::same_as>; { t.resolve(std::string_view{}) } -> std::same_as>; }; /** * @brief Simple hostnames to IP addresses resolver. */ class Resolver { boost::asio::io_context ioContext_; boost::asio::ip::tcp::resolver resolver_{ioContext_}; public: /** * @brief Resolve hostname to IP addresses. * * @throw This method throws an exception when the hostname cannot be resolved. * * @param hostname Hostname to resolve * @return IP addresses of the hostname */ std::vector resolve(std::string_view hostname); /** * @brief Resolve to IP addresses with port. * * @throw This method throws an exception when the hostname cannot be resolved. * * @param hostname Hostname to resolve * @param service Service to resolve * @return IP addresses of the hostname */ std::vector resolve(std::string_view hostname, std::string_view service); private: std::vector doResolve(std::string_view hostname, std::string_view service); }; } // namespace web