-fn build_proof(resolver: SocketAddr, domain: Name, ty: u16) -> Result<Vec<u8>, Error> {
- let mut stream = TcpStream::connect(resolver)?;
- let mut res = Vec::new();
- send_query(&mut stream, domain, ty)?;
- let mut reached_root = false;
- for _ in 0..10 {
- let rrsig_opt = read_response(&mut stream, &mut res)?;
- if let Some(rrsig) = rrsig_opt {
- if rrsig.name.as_str() == "." {
- reached_root = true;
- } else {
- if rrsig.name == rrsig.key_name {
- send_query(&mut stream, rrsig.key_name, DS::TYPE)?;
+macro_rules! build_proof_impl {
+ ($stream: ident, $send_query: ident, $read_response: ident $(, $async_ok: tt)?) => { {
+ let mut res = Vec::new();
+ let mut reached_root = false;
+ for i in 0..10 {
+ let rrsig_opt = $read_response(&mut $stream, &mut res)
+ $(.await?; $async_ok)??; // Either await?; Ok(())?, or just ?
+ if let Some(rrsig) = rrsig_opt {
+ if rrsig.name.as_str() == "." {
+ reached_root = true;