use rdap::{QueryType, RdapClient, RdapObject, RdapRequest};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = RdapClient::new()?;
let request = RdapRequest::new(QueryType::Domain, "example.com");
let result = client.query(&request).await?;
if let RdapObject::Domain(domain) = result {
println!("=== Domain Information ===\n");
if let Some(name) = &domain.ldh_name {
println!("Domain: {}", name);
}
if let Some(handle) = &domain.handle {
println!("Handle: {}", handle);
}
println!("\nStatus:");
for status in &domain.status {
println!(" - {}", status);
}
println!("\nNameservers:");
for ns in &domain.nameservers {
if let Some(name) = &ns.ldh_name {
print!(" - {}", name);
if let Some(ips) = &ns.ip_addresses {
let addrs: Vec<String> = ips.v4.iter().chain(&ips.v6).cloned().collect();
if !addrs.is_empty() {
print!(" ({})", addrs.join(", "));
}
}
println!();
}
}
if let Some(dnssec) = &domain.secure_dns {
println!("\nDNSSEC:");
if let Some(signed) = dnssec.delegation_signed {
println!(" Delegation Signed: {}", if signed { "Yes" } else { "No" });
}
if let Some(signed) = dnssec.zone_signed {
println!(" Zone Signed: {}", if signed { "Yes" } else { "No" });
}
if !dnssec.ds_data.is_empty() {
println!("\n DS Records:");
for ds in &dnssec.ds_data {
if let (Some(tag), Some(alg), Some(digest_type)) =
(ds.key_tag, ds.algorithm, ds.digest_type)
{
println!(
" - Key Tag: {}, Algorithm: {}, Digest Type: {}",
tag, alg, digest_type
);
if let Some(digest) = &ds.digest {
println!(" Digest: {}", digest);
}
}
}
}
}
println!("\nImportant Dates:");
for event in &domain.events {
match event.action.as_str() {
"registration" => println!(" Registered: {}", event.date),
"expiration" => println!(" Expires: {}", event.date),
"last changed" => println!(" Last Updated: {}", event.date),
_ => {}
}
}
println!("\nEntities:");
for entity in &domain.entities {
if let Some(handle) = &entity.handle {
println!(" - {} ({})", handle, entity.roles.join(", "));
if let Some(vcard) = &entity.vcard {
if let Some(name) = vcard.name() {
println!(" Name: {}", name);
}
if let Some(email) = vcard.email() {
println!(" Email: {}", email);
}
}
}
}
}
Ok(())
}