use std::str::FromStr; use anyhow::{bail, Result}; use trust_dns_client::client::{Client, SyncClient}; use trust_dns_client::rr::{DNSClass, Name, RData, RecordType}; use trust_dns_client::udp::UdpClientConnection; fn main() -> Result<()> { let (port, host) = resolve_dns("daeken.dev")?; dbg!(port); dbg!(host); Ok(()) } fn resolve_dns(server: &str) -> Result<(u16, String)> { let name = Name::from_str(&format!("_hypercosm._tls.{}", server))?; let resp = make_dns_client()?.query(&name, DNSClass::IN, RecordType::SRV)?; // TODO: Ensure exactly 1 result: I think. let ans = resp.answers()[0].rdata(); if let RData::SRV(srv) = ans { // TODO: Handle priority and weight. let port = srv.port(); // TODO: Should this be ascii or utf8 let name = srv.target().to_ascii(); Ok((port, name)) } else { bail!("Invalid DNS responce"); } } fn make_dns_client() -> Result { // TODO: Make this use TLS let addr = "1.1.1.1:53".parse()?; let conn = UdpClientConnection::new(addr)?; let client = SyncClient::new(conn); Ok(client) }