1use core::future::Future;
4
5use embassy_net::{Stack, dns::DnsQueryType};
6
7pub use embassy_net::IpAddress;
9
10pub type Addresses = heapless::Vec<IpAddress, 4>;
12
13pub trait Dns {
15 type Error;
17
18 fn resolve(&mut self, hostname: &str) -> impl Future<Output = Result<Addresses, Self::Error>>;
20}
21
22pub struct DnsWithStack<'a> {
24 stack: Stack<'a>,
25}
26
27impl<'a> DnsWithStack<'a> {
28 pub const fn new(stack: Stack<'a>) -> Self {
30 Self { stack }
31 }
32}
33
34impl Dns for DnsWithStack<'_> {
35 type Error = embassy_net::dns::Error;
36
37 async fn resolve(&mut self, hostname: &str) -> Result<Addresses, Self::Error> {
38 let resolved_addresses = self.stack.dns_query(hostname, DnsQueryType::A).await?;
39 let mut addresses = Addresses::new();
40 for address in resolved_addresses {
41 if addresses.push(address).is_err() {
42 break;
43 }
44 }
45 Ok(addresses)
46 }
47}