resolver.hpp 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. //
  2. // Copyright (c) 2025 Klemens Morgenstern (klemens.morgenstern@gmx.net)
  3. //
  4. // Distributed under the Boost Software License, Version 1.0. (See accompanying
  5. // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  6. //
  7. #ifndef BOOST_COBALT_RESOLVER_HPP
  8. #define BOOST_COBALT_RESOLVER_HPP
  9. #include <boost/cobalt/io/detail/config.hpp>
  10. #include <boost/cobalt/io/endpoint.hpp>
  11. #include <boost/cobalt/io/ops.hpp>
  12. #include <boost/cobalt/op.hpp>
  13. #include <boost/cobalt/promise.hpp>
  14. #include <boost/asio/ip/tcp.hpp>
  15. #include <boost/system/result.hpp>
  16. namespace boost::cobalt::io
  17. {
  18. struct BOOST_SYMBOL_VISIBLE resolver
  19. {
  20. using flags = asio::ip::resolver_base::flags;
  21. resolver(const executor & exec = this_thread::get_executor());
  22. resolver(resolver && ) = delete;
  23. void cancel();
  24. private:
  25. struct BOOST_COBALT_IO_DECL resolve_op_ final : op<system::error_code, endpoint_sequence>
  26. {
  27. void initiate(completion_handler<system::error_code, endpoint_sequence> h) override;
  28. resolve_op_(asio::ip::basic_resolver<protocol_type, executor> & resolver,
  29. std::string_view host, std::string_view service, flags flags_ = {})
  30. : resolver_(resolver), host_(host), service_(service), flags_(flags_) {}
  31. ~resolve_op_() = default;
  32. private:
  33. asio::ip::basic_resolver<protocol_type, executor> & resolver_;
  34. std::string_view host_;
  35. std::string_view service_;
  36. flags flags_;
  37. };
  38. public:
  39. [[nodiscard]] auto resolve(std::string_view host, std::string_view service,
  40. flags flags_ = {})
  41. {
  42. return resolve_op_{resolver_, host, service, flags_};
  43. }
  44. private:
  45. asio::ip::basic_resolver<protocol_type, executor> resolver_;
  46. };
  47. struct BOOST_COBALT_IO_DECL lookup final : op<system::error_code, endpoint_sequence>
  48. {
  49. lookup(std::string_view host, std::string_view service,
  50. const executor & exec = this_thread::get_executor(),
  51. resolver::flags flags_ = {})
  52. : host_(host), service_(service), resolver_{exec}, flags_{flags_} {}
  53. void initiate(completion_handler<system::error_code, endpoint_sequence> h) final override;
  54. ~lookup() = default;
  55. private:
  56. std::string_view host_;
  57. std::string_view service_;
  58. asio::ip::basic_resolver<protocol_type, executor> resolver_;
  59. resolver::flags flags_;
  60. };
  61. }
  62. #endif //BOOST_COBALT_RESOLVER_HPP