Skip to main content

dns_update/
update.rs

1/*
2 * Copyright Stalwart Labs LLC See the COPYING
3 * file at the top-level directory of this distribution.
4 *
5 * Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6 * https://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7 * <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your
8 * option. This file may not be copied, modified, or distributed
9 * except according to those terms.
10 */
11
12#[cfg(any(feature = "ring", feature = "aws-lc-rs"))]
13use crate::providers::oraclecloud::{OracleCloudConfig, OracleCloudProvider};
14#[cfg(any(feature = "ring", feature = "aws-lc-rs"))]
15use crate::providers::ovh::{OvhEndpoint, OvhProvider};
16
17#[cfg(any(feature = "ring", feature = "aws-lc-rs"))]
18use crate::providers::transip::TransipProvider;
19
20#[cfg(feature = "test_provider")]
21use crate::providers::{in_memory::InMemoryProvider, pebble::PebbleProvider};
22
23#[cfg(feature = "test_provider")]
24use crate::NamedDnsRecord;
25
26#[cfg(feature = "test_provider")]
27use std::sync::{Arc, Mutex};
28
29use crate::{
30    DnsRecord, DnsRecordType, DnsUpdater, IntoFqdn, TsigAlgorithm,
31    providers::{
32        alidns::AlidnsProvider,
33        arvancloud::ArvanCloudProvider,
34        autodns::AutodnsProvider,
35        azuredns::{AzureDnsConfig, AzureDnsProvider},
36        baiducloud::BaiduCloudProvider,
37        bluecatv2::{BluecatV2Config, BluecatV2Provider},
38        bunny::BunnyProvider,
39        cloudflare::CloudflareProvider,
40        cloudns::ClouDnsProvider,
41        constellix::ConstellixProvider,
42        cpanel::CpanelProvider,
43        ddnss::DdnssProvider,
44        desec::DesecProvider,
45        digitalocean::DigitalOceanProvider,
46        dnsimple::DNSimpleProvider,
47        dnsmadeeasy::DnsMadeEasyProvider,
48        domeneshop::DomeneshopProvider,
49        dreamhost::DreamhostProvider,
50        duckdns::DuckDnsProvider,
51        dynu::DynuProvider,
52        easydns::EasyDnsProvider,
53        edgedns::{EdgeDnsConfig, EdgeDnsProvider},
54        exoscale::ExoscaleProvider,
55        freemyip::FreeMyIpProvider,
56        gandiv5::GandiV5Provider,
57        gcore::GcoreProvider,
58        glesys::GlesysProvider,
59        godaddy::GodaddyProvider,
60        hetzner::HetznerProvider,
61        hostingde::HostingDeProvider,
62        hostinger::HostingerProvider,
63        huaweicloud::HuaweiCloudProvider,
64        hurricane::HurricaneProvider,
65        ibmcloud::IbmCloudProvider,
66        infoblox::{InfobloxConfig, InfobloxProvider},
67        infomaniak::InfomaniakProvider,
68        inwx::InwxProvider,
69        ionos::IonosProvider,
70        ipv64::Ipv64Provider,
71        joker::{JokerAuth, JokerProvider},
72        lightsail::{LightsailConfig, LightsailProvider},
73        linode::LinodeProvider,
74        luadns::LuaDnsProvider,
75        mythicbeasts::MythicBeastsProvider,
76        namecheap::NamecheapProvider,
77        namedotcom::NameDotComProvider,
78        namesilo::NameSiloProvider,
79        netcup::NetcupProvider,
80        netlify::NetlifyProvider,
81        nifcloud::NifcloudProvider,
82        ns1::Ns1Provider,
83        plesk::PleskProvider,
84        porkbun::PorkBunProvider,
85        rfc2136::{DnsAddress, Rfc2136Provider},
86        route53::Route53Provider,
87        safedns::SafeDnsProvider,
88        scaleway::ScalewayProvider,
89        spaceship::SpaceshipProvider,
90        tencentcloud::TencentCloudProvider,
91        ultradns::UltraDnsProvider,
92        vercel::VercelProvider,
93        vultr::VultrProvider,
94        websupport::WebSupportProvider,
95    },
96};
97use std::collections::HashMap;
98use std::time::Duration;
99
100impl DnsUpdater {
101    /// Create a new DNS updater using the RFC 2136 protocol and TSIG authentication.
102    pub fn new_rfc2136_tsig(
103        addr: impl TryInto<DnsAddress>,
104        key_name: impl AsRef<str>,
105        key: impl Into<Vec<u8>>,
106        algorithm: TsigAlgorithm,
107    ) -> crate::Result<Self> {
108        Ok(DnsUpdater::Rfc2136(Rfc2136Provider::new_tsig(
109            addr,
110            key_name,
111            key,
112            algorithm.into(),
113        )?))
114    }
115
116    /// Create a new DNS updater using the Cloudflare API.
117    pub fn new_cloudflare(
118        secret: impl AsRef<str>,
119        timeout: Option<Duration>,
120    ) -> crate::Result<Self> {
121        Ok(DnsUpdater::Cloudflare(CloudflareProvider::new(
122            secret, timeout,
123        )?))
124    }
125
126    /// Create a new DNS updater using the DigitalOcean API.
127    pub fn new_digitalocean(
128        auth_token: impl AsRef<str>,
129        timeout: Option<Duration>,
130    ) -> crate::Result<Self> {
131        Ok(DnsUpdater::DigitalOcean(DigitalOceanProvider::new(
132            auth_token, timeout,
133        )))
134    }
135
136    /// Create a new DNS updater using the Desec.io API.
137    pub fn new_desec(
138        auth_token: impl AsRef<str>,
139        timeout: Option<Duration>,
140    ) -> crate::Result<Self> {
141        Ok(DnsUpdater::Desec(DesecProvider::new(auth_token, timeout)))
142    }
143
144    /// Create a new DNS updater using the Constellix API.
145    pub fn new_constellix(
146        api_key: impl AsRef<str>,
147        secret_key: impl AsRef<str>,
148        timeout: Option<Duration>,
149    ) -> crate::Result<Self> {
150        Ok(DnsUpdater::Constellix(ConstellixProvider::new(
151            api_key, secret_key, timeout,
152        )?))
153    }
154
155    /// Create a new DNS updater using the DNSMadeEasy API.
156    pub fn new_dnsmadeeasy(
157        api_key: impl AsRef<str>,
158        api_secret: impl AsRef<str>,
159        timeout: Option<Duration>,
160    ) -> crate::Result<Self> {
161        Ok(DnsUpdater::DnsMadeEasy(DnsMadeEasyProvider::new(
162            api_key, api_secret, timeout,
163        )?))
164    }
165
166    /// Create a new DNS updater using the OVH API.
167    #[cfg(any(feature = "ring", feature = "aws-lc-rs"))]
168    pub fn new_ovh(
169        application_key: impl AsRef<str>,
170        application_secret: impl AsRef<str>,
171        consumer_key: impl AsRef<str>,
172        endpoint: OvhEndpoint,
173        timeout: Option<Duration>,
174    ) -> crate::Result<Self> {
175        Ok(DnsUpdater::Ovh(OvhProvider::new(
176            application_key,
177            application_secret,
178            consumer_key,
179            endpoint,
180            timeout,
181        )?))
182    }
183
184    /// Create a new DNS updater using the Oracle Cloud Infrastructure DNS API.
185    #[cfg(any(feature = "ring", feature = "aws-lc-rs"))]
186    pub fn new_oraclecloud(config: OracleCloudConfig) -> crate::Result<Self> {
187        Ok(DnsUpdater::OracleCloud(OracleCloudProvider::new(config)?))
188    }
189
190    /// Create a new DNS updater using the Bunny API.
191    pub fn new_bunny(api_key: impl AsRef<str>, timeout: Option<Duration>) -> crate::Result<Self> {
192        Ok(DnsUpdater::Bunny(BunnyProvider::new(api_key, timeout)?))
193    }
194
195    /// Create a new DNS updater using the Linode API.
196    pub fn new_linode(
197        auth_token: impl AsRef<str>,
198        timeout: Option<Duration>,
199    ) -> crate::Result<Self> {
200        Ok(DnsUpdater::Linode(LinodeProvider::new(auth_token, timeout)))
201    }
202
203    /// Create a new DNS updater using the Porkbun API.
204    pub fn new_porkbun(
205        api_key: impl AsRef<str>,
206        secret_api_key: impl AsRef<str>,
207        timeout: Option<Duration>,
208    ) -> crate::Result<Self> {
209        Ok(DnsUpdater::Porkbun(PorkBunProvider::new(
210            api_key,
211            secret_api_key,
212            timeout,
213        )))
214    }
215
216    /// Create a new DNS updater using the Exoscale DNS API.
217    pub fn new_exoscale(
218        api_key: impl AsRef<str>,
219        api_secret: impl AsRef<str>,
220        timeout: Option<Duration>,
221    ) -> crate::Result<Self> {
222        Ok(DnsUpdater::Exoscale(ExoscaleProvider::new(
223            api_key, api_secret, timeout,
224        )?))
225    }
226
227    /// Create a new DNS updater using the Nifcloud DNS API.
228    pub fn new_nifcloud(
229        access_key: impl AsRef<str>,
230        secret_key: impl AsRef<str>,
231        timeout: Option<Duration>,
232    ) -> crate::Result<Self> {
233        Ok(DnsUpdater::Nifcloud(NifcloudProvider::new(
234            access_key, secret_key, timeout,
235        )?))
236    }
237
238    /// Create a new DNS updater using the WebSupport API.
239    pub fn new_websupport(
240        api_key: impl AsRef<str>,
241        secret: impl AsRef<str>,
242        timeout: Option<Duration>,
243    ) -> crate::Result<Self> {
244        Ok(DnsUpdater::WebSupport(WebSupportProvider::new(
245            api_key, secret, timeout,
246        )?))
247    }
248
249    /// Create a new DNS updater using the Spaceship API.
250    pub fn new_spaceship(
251        api_key: impl AsRef<str>,
252        api_secret: impl AsRef<str>,
253        timeout: Option<Duration>,
254    ) -> crate::Result<Self> {
255        Ok(DnsUpdater::Spaceship(SpaceshipProvider::new(
256            api_key, api_secret, timeout,
257        )))
258    }
259
260    /// Create a new DNS updater using the DNSimple API.
261    pub fn new_dnsimple(
262        auth_token: impl AsRef<str>,
263        account_id: impl AsRef<str>,
264        timeout: Option<Duration>,
265    ) -> crate::Result<Self> {
266        Ok(DnsUpdater::DNSimple(DNSimpleProvider::new(
267            auth_token, account_id, timeout,
268        )))
269    }
270
271    /// Create a new DNS updater using the Gandi LiveDNS API (v5).
272    pub fn new_gandiv5(
273        personal_access_token: impl AsRef<str>,
274        timeout: Option<Duration>,
275    ) -> crate::Result<Self> {
276        Ok(DnsUpdater::GandiV5(GandiV5Provider::new(
277            personal_access_token,
278            timeout,
279        )?))
280    }
281
282    /// Create a new DNS updater using the GoDaddy API.
283    pub fn new_godaddy(
284        api_key: impl AsRef<str>,
285        api_secret: impl AsRef<str>,
286        timeout: Option<Duration>,
287    ) -> crate::Result<Self> {
288        Ok(DnsUpdater::Godaddy(GodaddyProvider::new(
289            api_key, api_secret, timeout,
290        )?))
291    }
292
293    /// Create a new DNS updater using the Hetzner Cloud DNS (v1) API.
294    pub fn new_hetzner(
295        api_token: impl AsRef<str>,
296        timeout: Option<Duration>,
297    ) -> crate::Result<Self> {
298        Ok(DnsUpdater::Hetzner(HetznerProvider::new(
299            api_token, timeout,
300        )?))
301    }
302
303    /// Create a new DNS updater using the Name.com v4 API.
304    pub fn new_namedotcom(
305        username: impl AsRef<str>,
306        api_token: impl AsRef<str>,
307        timeout: Option<Duration>,
308    ) -> crate::Result<Self> {
309        Ok(DnsUpdater::NameDotCom(NameDotComProvider::new(
310            username, api_token, timeout,
311        )?))
312    }
313
314    /// Create a new DNS updater using the NameSilo API.
315    pub fn new_namesilo(
316        api_key: impl AsRef<str>,
317        timeout: Option<Duration>,
318    ) -> crate::Result<Self> {
319        Ok(DnsUpdater::NameSilo(NameSiloProvider::new(
320            api_key, timeout,
321        )?))
322    }
323
324    /// Create a new DNS updater using the DuckDNS API.
325    pub fn new_duckdns(token: impl AsRef<str>, timeout: Option<Duration>) -> crate::Result<Self> {
326        Ok(DnsUpdater::DuckDns(DuckDnsProvider::new(token, timeout)?))
327    }
328
329    /// Create a new DNS updater using the freemyip.com API.
330    pub fn new_freemyip(token: impl AsRef<str>, timeout: Option<Duration>) -> crate::Result<Self> {
331        Ok(DnsUpdater::FreeMyIp(FreeMyIpProvider::new(token, timeout)?))
332    }
333
334    /// Create a new DNS updater using the IPv64 API.
335    pub fn new_ipv64(api_key: impl AsRef<str>, timeout: Option<Duration>) -> crate::Result<Self> {
336        Ok(DnsUpdater::Ipv64(Ipv64Provider::new(api_key, timeout)?))
337    }
338
339    /// Create a new DNS updater using the DDNSS.de API.
340    pub fn new_ddnss(key: impl AsRef<str>, timeout: Option<Duration>) -> crate::Result<Self> {
341        Ok(DnsUpdater::Ddnss(DdnssProvider::new(key, timeout)?))
342    }
343
344    /// Create a new DNS updater using the Dynu API.
345    pub fn new_dynu(api_key: impl AsRef<str>, timeout: Option<Duration>) -> crate::Result<Self> {
346        Ok(DnsUpdater::Dynu(DynuProvider::new(api_key, timeout)?))
347    }
348
349    /// Create a new DNS updater using the Google Cloud DNS API.
350    pub fn new_google_cloud_dns(
351        config: crate::providers::google_cloud_dns::GoogleCloudDnsConfig,
352    ) -> crate::Result<Self> {
353        Ok(DnsUpdater::GoogleCloudDns(
354            crate::providers::google_cloud_dns::GoogleCloudDnsProvider::new(config)?,
355        ))
356    }
357
358    /// Create a new DNS updater using the Route53 API.
359    pub fn new_route53(config: crate::providers::route53::Route53Config) -> crate::Result<Self> {
360        Ok(DnsUpdater::Route53(Route53Provider::new(config)))
361    }
362
363    /// Create a new DNS updater using the Vultr API.
364    pub fn new_vultr(api_key: impl AsRef<str>, timeout: Option<Duration>) -> crate::Result<Self> {
365        Ok(DnsUpdater::Vultr(VultrProvider::new(api_key, timeout)))
366    }
367
368    /// Create a new DNS updater using the Scaleway Domains API.
369    pub fn new_scaleway(
370        api_token: impl AsRef<str>,
371        timeout: Option<Duration>,
372    ) -> crate::Result<Self> {
373        Ok(DnsUpdater::Scaleway(ScalewayProvider::new(
374            api_token, timeout,
375        )))
376    }
377
378    /// Create a new DNS updater using the Gcore DNS API.
379    pub fn new_gcore(api_token: impl AsRef<str>, timeout: Option<Duration>) -> crate::Result<Self> {
380        Ok(DnsUpdater::Gcore(GcoreProvider::new(api_token, timeout)))
381    }
382
383    /// Create a new DNS updater using the Vercel API.
384    pub fn new_vercel(
385        auth_token: impl AsRef<str>,
386        team_id: Option<impl AsRef<str>>,
387        timeout: Option<Duration>,
388    ) -> crate::Result<Self> {
389        Ok(DnsUpdater::Vercel(VercelProvider::new(
390            auth_token, team_id, timeout,
391        )))
392    }
393
394    /// Create a new DNS updater using the IONOS DNS API.
395    pub fn new_ionos(api_key: impl AsRef<str>, timeout: Option<Duration>) -> crate::Result<Self> {
396        Ok(DnsUpdater::Ionos(IonosProvider::new(api_key, timeout)))
397    }
398
399    /// Create a new DNS updater using the hosting.de API.
400    pub fn new_hostingde(
401        api_key: impl AsRef<str>,
402        timeout: Option<Duration>,
403    ) -> crate::Result<Self> {
404        Ok(DnsUpdater::HostingDe(HostingDeProvider::new(
405            api_key, timeout,
406        )))
407    }
408
409    /// Create a new DNS updater using the Domeneshop API.
410    pub fn new_domeneshop(
411        api_token: impl AsRef<str>,
412        api_secret: impl AsRef<str>,
413        timeout: Option<Duration>,
414    ) -> crate::Result<Self> {
415        Ok(DnsUpdater::Domeneshop(DomeneshopProvider::new(
416            api_token, api_secret, timeout,
417        )))
418    }
419
420    /// Create a new DNS updater using the ANS SafeDNS API.
421    pub fn new_safedns(
422        auth_token: impl AsRef<str>,
423        timeout: Option<Duration>,
424    ) -> crate::Result<Self> {
425        Ok(DnsUpdater::Safedns(SafeDnsProvider::new(
426            auth_token, timeout,
427        )))
428    }
429
430    /// Create a new DNS updater using the ArvanCloud API.
431    pub fn new_arvancloud(
432        api_key: impl AsRef<str>,
433        timeout: Option<Duration>,
434    ) -> crate::Result<Self> {
435        Ok(DnsUpdater::ArvanCloud(ArvanCloudProvider::new(
436            api_key, timeout,
437        )))
438    }
439
440    /// Create a new DNS updater using the Infomaniak API.
441    pub fn new_infomaniak(
442        access_token: impl AsRef<str>,
443        timeout: Option<Duration>,
444    ) -> crate::Result<Self> {
445        Ok(DnsUpdater::Infomaniak(InfomaniakProvider::new(
446            access_token,
447            timeout,
448        )))
449    }
450
451    /// Create a new DNS updater using the NS1 API.
452    pub fn new_ns1(api_key: impl AsRef<str>, timeout: Option<Duration>) -> crate::Result<Self> {
453        Ok(DnsUpdater::Ns1(Ns1Provider::new(api_key, timeout)))
454    }
455
456    /// Create a new DNS updater using the LuaDNS API.
457    pub fn new_luadns(
458        api_username: impl AsRef<str>,
459        api_token: impl AsRef<str>,
460        timeout: Option<Duration>,
461    ) -> crate::Result<Self> {
462        Ok(DnsUpdater::LuaDns(LuaDnsProvider::new(
463            api_username,
464            api_token,
465            timeout,
466        )))
467    }
468
469    /// Create a new DNS updater using the Netcup CCP API.
470    pub fn new_netcup(
471        customer_number: impl AsRef<str>,
472        api_key: impl AsRef<str>,
473        api_password: impl AsRef<str>,
474        timeout: Option<Duration>,
475    ) -> crate::Result<Self> {
476        Ok(DnsUpdater::Netcup(NetcupProvider::new(
477            customer_number,
478            api_key,
479            api_password,
480            timeout,
481        )))
482    }
483
484    /// Create a new DNS updater using the Netlify API.
485    pub fn new_netlify(
486        access_token: impl AsRef<str>,
487        timeout: Option<Duration>,
488    ) -> crate::Result<Self> {
489        Ok(DnsUpdater::Netlify(NetlifyProvider::new(
490            access_token,
491            timeout,
492        )))
493    }
494
495    /// Create a new DNS updater using the INWX JSON-RPC API.
496    pub fn new_inwx(
497        username: impl Into<String>,
498        password: impl Into<String>,
499        shared_secret: Option<String>,
500        sandbox: bool,
501        timeout: Option<Duration>,
502    ) -> crate::Result<Self> {
503        Ok(DnsUpdater::Inwx(InwxProvider::new(
504            username,
505            password,
506            shared_secret,
507            sandbox,
508            timeout,
509        )?))
510    }
511
512    /// Create a new DNS updater using the Alibaba Cloud DNS API.
513    pub fn new_alidns(
514        access_key: impl AsRef<str>,
515        secret_key: impl AsRef<str>,
516        region: Option<impl AsRef<str>>,
517        security_token: Option<impl AsRef<str>>,
518        line: Option<impl AsRef<str>>,
519        timeout: Option<Duration>,
520    ) -> crate::Result<Self> {
521        Ok(DnsUpdater::Alidns(AlidnsProvider::new(
522            access_key,
523            secret_key,
524            region,
525            security_token,
526            line,
527            timeout,
528        )?))
529    }
530
531    /// Create a new DNS updater using the Huawei Cloud DNS API.
532    pub fn new_huaweicloud(
533        access_key: impl AsRef<str>,
534        secret_key: impl AsRef<str>,
535        region: impl AsRef<str>,
536        timeout: Option<Duration>,
537    ) -> crate::Result<Self> {
538        Ok(DnsUpdater::HuaweiCloud(HuaweiCloudProvider::new(
539            access_key.as_ref(),
540            secret_key.as_ref(),
541            region.as_ref(),
542            timeout,
543        )?))
544    }
545
546    /// Create a new DNS updater using the ClouDNS API.
547    pub fn new_cloudns(
548        auth_id: Option<impl AsRef<str>>,
549        sub_auth_id: Option<impl AsRef<str>>,
550        auth_password: impl AsRef<str>,
551        timeout: Option<Duration>,
552    ) -> crate::Result<Self> {
553        Ok(DnsUpdater::ClouDns(ClouDnsProvider::new(
554            auth_id,
555            sub_auth_id,
556            auth_password,
557            timeout,
558        )?))
559    }
560
561    /// Create a new DNS updater using the Tencent Cloud DNSPod API.
562    pub fn new_tencentcloud(
563        secret_id: impl AsRef<str>,
564        secret_key: impl AsRef<str>,
565        region: Option<impl AsRef<str>>,
566        session_token: Option<impl AsRef<str>>,
567        timeout: Option<Duration>,
568    ) -> crate::Result<Self> {
569        Ok(DnsUpdater::TencentCloud(TencentCloudProvider::new(
570            secret_id,
571            secret_key,
572            region,
573            session_token,
574            timeout,
575        )?))
576    }
577
578    /// Create a new DNS updater using the Baidu Cloud DNS API.
579    pub fn new_baiducloud(
580        access_key: impl AsRef<str>,
581        secret_key: impl AsRef<str>,
582        timeout: Option<Duration>,
583    ) -> crate::Result<Self> {
584        Ok(DnsUpdater::BaiduCloud(BaiduCloudProvider::new(
585            access_key.as_ref(),
586            secret_key.as_ref(),
587            timeout,
588        )?))
589    }
590
591    /// Create a new DNS updater using the EasyDNS REST API.
592    pub fn new_easydns(
593        token: impl AsRef<str>,
594        key: impl AsRef<str>,
595        timeout: Option<Duration>,
596    ) -> crate::Result<Self> {
597        Ok(DnsUpdater::EasyDns(EasyDnsProvider::new(
598            token, key, timeout,
599        )?))
600    }
601
602    /// Create a new DNS updater using the Joker DMAPI.
603    pub fn new_joker(auth: JokerAuth, timeout: Option<Duration>) -> crate::Result<Self> {
604        Ok(DnsUpdater::Joker(JokerProvider::new(auth, timeout)?))
605    }
606
607    /// Create a new DNS updater using the Mythic Beasts DNSv2 API.
608    pub fn new_mythicbeasts(
609        username: impl AsRef<str>,
610        password: impl AsRef<str>,
611        timeout: Option<Duration>,
612    ) -> crate::Result<Self> {
613        Ok(DnsUpdater::MythicBeasts(MythicBeastsProvider::new(
614            username, password, timeout,
615        )?))
616    }
617
618    /// Create a new DNS updater using the Namecheap XML API.
619    pub fn new_namecheap(
620        api_user: impl AsRef<str>,
621        api_key: impl AsRef<str>,
622        client_ip: impl AsRef<str>,
623        username: Option<impl AsRef<str>>,
624        timeout: Option<Duration>,
625    ) -> crate::Result<Self> {
626        Ok(DnsUpdater::Namecheap(NamecheapProvider::new(
627            api_user, api_key, client_ip, username, timeout,
628        )?))
629    }
630
631    /// Create a new DNS updater using the TransIP v6 API.
632    #[cfg(any(feature = "ring", feature = "aws-lc-rs"))]
633    pub fn new_transip(
634        login: impl AsRef<str>,
635        private_key_pem: impl AsRef<str>,
636        timeout: Option<Duration>,
637    ) -> crate::Result<Self> {
638        Ok(DnsUpdater::Transip(TransipProvider::new(
639            login,
640            private_key_pem,
641            timeout,
642        )?))
643    }
644
645    /// Create a new DNS updater using the Bluecat Address Manager v2 REST API.
646    pub fn new_bluecatv2(config: BluecatV2Config) -> crate::Result<Self> {
647        Ok(DnsUpdater::BluecatV2(BluecatV2Provider::new(config)?))
648    }
649
650    /// Create a new DNS updater using the GleSYS API.
651    pub fn new_glesys(
652        api_user: impl AsRef<str>,
653        api_key: impl AsRef<str>,
654        timeout: Option<Duration>,
655    ) -> crate::Result<Self> {
656        Ok(DnsUpdater::Glesys(GlesysProvider::new(
657            api_user, api_key, timeout,
658        )))
659    }
660
661    /// Create a new DNS updater using the Dreamhost API.
662    pub fn new_dreamhost(
663        api_key: impl AsRef<str>,
664        timeout: Option<Duration>,
665    ) -> crate::Result<Self> {
666        Ok(DnsUpdater::Dreamhost(DreamhostProvider::new(
667            api_key, timeout,
668        )))
669    }
670
671    /// Create a new DNS updater using the Volcano Engine API.
672    #[cfg(any(feature = "ring", feature = "aws-lc-rs"))]
673    pub fn new_volcengine(
674        config: crate::providers::volcengine::VolcengineConfig,
675    ) -> crate::Result<Self> {
676        Ok(DnsUpdater::Volcengine(
677            crate::providers::volcengine::VolcengineProvider::new(config)?,
678        ))
679    }
680
681    /// Create a new DNS updater using the Yandex Cloud DNS API.
682    #[cfg(any(feature = "ring", feature = "aws-lc-rs"))]
683    pub fn new_yandexcloud(
684        config: crate::providers::yandexcloud::YandexCloudConfig,
685    ) -> crate::Result<Self> {
686        Ok(DnsUpdater::YandexCloud(
687            crate::providers::yandexcloud::YandexCloudProvider::new(config)?,
688        ))
689    }
690
691    /// Create a new DNS updater using the Azure DNS REST API with OAuth2 client credentials.
692    pub fn new_azuredns(config: AzureDnsConfig) -> crate::Result<Self> {
693        Ok(DnsUpdater::AzureDns(AzureDnsProvider::new(config)?))
694    }
695
696    /// Create a new DNS updater using the IBM Cloud (SoftLayer classic) DNS API.
697    pub fn new_ibmcloud(
698        username: impl AsRef<str>,
699        api_key: impl AsRef<str>,
700        timeout: Option<Duration>,
701    ) -> crate::Result<Self> {
702        Ok(DnsUpdater::IbmCloud(IbmCloudProvider::new(
703            username, api_key, timeout,
704        )?))
705    }
706
707    /// Create a new DNS updater using the Hurricane Electric free DNS service.
708    pub fn new_hurricane(
709        credentials: HashMap<String, String>,
710        timeout: Option<Duration>,
711    ) -> crate::Result<Self> {
712        Ok(DnsUpdater::Hurricane(HurricaneProvider::new(
713            credentials,
714            timeout,
715        )?))
716    }
717
718    /// Create a new DNS updater using the Hostinger DNS API.
719    pub fn new_hostinger(
720        api_token: impl AsRef<str>,
721        timeout: Option<Duration>,
722    ) -> crate::Result<Self> {
723        Ok(DnsUpdater::Hostinger(HostingerProvider::new(
724            api_token, timeout,
725        )?))
726    }
727
728    /// Create a new DNS updater using the InterNetX AutoDNS API.
729    pub fn new_autodns(
730        username: impl AsRef<str>,
731        password: impl AsRef<str>,
732        context: Option<u32>,
733        timeout: Option<Duration>,
734    ) -> crate::Result<Self> {
735        Ok(DnsUpdater::Autodns(AutodnsProvider::new(
736            username, password, context, timeout,
737        )?))
738    }
739
740    /// Create a new DNS updater using the Plesk REST API (`X-API-Key` auth).
741    pub fn new_plesk(
742        base_url: impl AsRef<str>,
743        api_key: impl AsRef<str>,
744        timeout: Option<Duration>,
745    ) -> crate::Result<Self> {
746        Ok(DnsUpdater::Plesk(PleskProvider::new(
747            base_url, api_key, timeout,
748        )))
749    }
750
751    /// Create a new DNS updater using the cPanel UAPI (API token auth).
752    pub fn new_cpanel(
753        base_url: impl AsRef<str>,
754        username: impl AsRef<str>,
755        token: impl AsRef<str>,
756        timeout: Option<Duration>,
757    ) -> crate::Result<Self> {
758        Ok(DnsUpdater::Cpanel(CpanelProvider::new(
759            base_url, username, token, timeout,
760        )))
761    }
762
763    /// Create a new DNS updater using the AWS Lightsail DNS API.
764    pub fn new_lightsail(config: LightsailConfig) -> crate::Result<Self> {
765        Ok(DnsUpdater::Lightsail(LightsailProvider::new(config)?))
766    }
767
768    /// Create a new DNS updater using the Akamai EdgeDNS API.
769    pub fn new_edgedns(config: EdgeDnsConfig) -> crate::Result<Self> {
770        Ok(DnsUpdater::EdgeDns(EdgeDnsProvider::new(config)?))
771    }
772
773    /// Create a new DNS updater using the UltraDNS REST API.
774    pub fn new_ultradns(
775        username: impl Into<String>,
776        password: impl Into<String>,
777        endpoint: Option<String>,
778        timeout: Option<Duration>,
779    ) -> crate::Result<Self> {
780        Ok(DnsUpdater::UltraDns(UltraDnsProvider::new(
781            username, password, endpoint, timeout,
782        )?))
783    }
784
785    /// Create a new DNS updater using the Infoblox NIOS WAPI.
786    pub fn new_infoblox(config: InfobloxConfig) -> crate::Result<Self> {
787        Ok(DnsUpdater::Infoblox(InfobloxProvider::new(config)?))
788    }
789
790    /// Create a new DNS updater using the Pebble Challenge Test Server.
791    #[cfg(feature = "test_provider")]
792    pub fn new_pebble(base_url: impl AsRef<str>, timeout: Option<Duration>) -> Self {
793        DnsUpdater::Pebble(PebbleProvider::new(base_url, timeout))
794    }
795
796    /// Create a new DNS updater backed by an in-memory record store.
797    #[cfg(feature = "test_provider")]
798    pub fn new_in_memory(records: Arc<Mutex<Vec<NamedDnsRecord>>>) -> Self {
799        DnsUpdater::InMemory(InMemoryProvider::new(records))
800    }
801
802    /// Create a new DNS record.
803    pub async fn create(
804        &self,
805        name: impl IntoFqdn<'_>,
806        record: DnsRecord,
807        ttl: u32,
808        origin: impl IntoFqdn<'_>,
809    ) -> crate::Result<()> {
810        match self {
811            DnsUpdater::Alidns(provider) => provider.create(name, record, ttl, origin).await,
812            DnsUpdater::AzureDns(provider) => provider.create(name, record, ttl, origin).await,
813            DnsUpdater::Bunny(provider) => provider.create(name, record, ttl, origin).await,
814            DnsUpdater::Cloudflare(provider) => provider.create(name, record, ttl, origin).await,
815            DnsUpdater::Ddnss(provider) => provider.create(name, record, ttl, origin).await,
816            DnsUpdater::Desec(provider) => provider.create(name, record, ttl, origin).await,
817            DnsUpdater::DigitalOcean(provider) => provider.create(name, record, ttl, origin).await,
818            DnsUpdater::DNSimple(provider) => provider.create(name, record, ttl, origin).await,
819            DnsUpdater::GandiV5(provider) => provider.create(name, record, ttl, origin).await,
820            DnsUpdater::Gcore(provider) => provider.create(name, record, ttl, origin).await,
821            DnsUpdater::Godaddy(provider) => provider.create(name, record, ttl, origin).await,
822            DnsUpdater::Hetzner(provider) => provider.create(name, record, ttl, origin).await,
823            DnsUpdater::Linode(provider) => provider.create(name, record, ttl, origin).await,
824            DnsUpdater::NameDotCom(provider) => provider.create(name, record, ttl, origin).await,
825            DnsUpdater::NameSilo(provider) => provider.create(name, record, ttl, origin).await,
826            DnsUpdater::DuckDns(provider) => provider.create(name, record, ttl, origin).await,
827            DnsUpdater::Dynu(provider) => provider.create(name, record, ttl, origin).await,
828            DnsUpdater::FreeMyIp(provider) => provider.create(name, record, ttl, origin).await,
829            DnsUpdater::Ipv64(provider) => provider.create(name, record, ttl, origin).await,
830            DnsUpdater::Constellix(provider) => provider.create(name, record, ttl, origin).await,
831            DnsUpdater::DnsMadeEasy(provider) => provider.create(name, record, ttl, origin).await,
832            DnsUpdater::Exoscale(provider) => provider.create(name, record, ttl, origin).await,
833            DnsUpdater::Nifcloud(provider) => provider.create(name, record, ttl, origin).await,
834            DnsUpdater::IbmCloud(provider) => provider.create(name, record, ttl, origin).await,
835            #[cfg(any(feature = "ring", feature = "aws-lc-rs"))]
836            DnsUpdater::Ovh(provider) => provider.create(name, record, ttl, origin).await,
837            #[cfg(any(feature = "ring", feature = "aws-lc-rs"))]
838            DnsUpdater::OracleCloud(provider) => provider.create(name, record, ttl, origin).await,
839            DnsUpdater::Porkbun(provider) => provider.create(name, record, ttl, origin).await,
840            DnsUpdater::Rfc2136(provider) => provider.create(name, record, ttl, origin).await,
841            DnsUpdater::Route53(provider) => provider.create(name, record, ttl, origin).await,
842            DnsUpdater::Scaleway(provider) => provider.create(name, record, ttl, origin).await,
843            DnsUpdater::Spaceship(provider) => provider.create(name, record, ttl, origin).await,
844            DnsUpdater::Vercel(provider) => provider.create(name, record, ttl, origin).await,
845            DnsUpdater::Vultr(provider) => provider.create(name, record, ttl, origin).await,
846            DnsUpdater::WebSupport(provider) => provider.create(name, record, ttl, origin).await,
847            DnsUpdater::TencentCloud(provider) => provider.create(name, record, ttl, origin).await,
848            DnsUpdater::Plesk(provider) => provider.create(name, record, ttl, origin).await,
849            DnsUpdater::Cpanel(provider) => provider.create(name, record, ttl, origin).await,
850            DnsUpdater::GoogleCloudDns(provider) => {
851                provider.create(name, record, ttl, origin).await
852            }
853            DnsUpdater::Ionos(provider) => provider.create(name, record, ttl, origin).await,
854            DnsUpdater::HostingDe(provider) => provider.create(name, record, ttl, origin).await,
855            DnsUpdater::Infomaniak(provider) => provider.create(name, record, ttl, origin).await,
856            DnsUpdater::Netcup(provider) => provider.create(name, record, ttl, origin).await,
857            DnsUpdater::Netlify(provider) => provider.create(name, record, ttl, origin).await,
858            DnsUpdater::EasyDns(provider) => provider.create(name, record, ttl, origin).await,
859            DnsUpdater::Joker(provider) => provider.create(name, record, ttl, origin).await,
860            DnsUpdater::MythicBeasts(provider) => provider.create(name, record, ttl, origin).await,
861            DnsUpdater::Namecheap(provider) => provider.create(name, record, ttl, origin).await,
862            #[cfg(any(feature = "ring", feature = "aws-lc-rs"))]
863            DnsUpdater::Transip(provider) => provider.create(name, record, ttl, origin).await,
864            DnsUpdater::HuaweiCloud(provider) => provider.create(name, record, ttl, origin).await,
865            DnsUpdater::BaiduCloud(provider) => provider.create(name, record, ttl, origin).await,
866            #[cfg(any(feature = "ring", feature = "aws-lc-rs"))]
867            DnsUpdater::Volcengine(provider) => provider.create(name, record, ttl, origin).await,
868            #[cfg(any(feature = "ring", feature = "aws-lc-rs"))]
869            DnsUpdater::YandexCloud(provider) => provider.create(name, record, ttl, origin).await,
870            DnsUpdater::Hurricane(provider) => provider.create(name, record, ttl, origin).await,
871            DnsUpdater::Hostinger(provider) => provider.create(name, record, ttl, origin).await,
872            DnsUpdater::Autodns(provider) => provider.create(name, record, ttl, origin).await,
873            DnsUpdater::Lightsail(provider) => provider.create(name, record, ttl, origin).await,
874            DnsUpdater::EdgeDns(provider) => provider.create(name, record, ttl, origin).await,
875            DnsUpdater::Inwx(provider) => provider.create(name, record, ttl, origin).await,
876            DnsUpdater::UltraDns(provider) => provider.create(name, record, ttl, origin).await,
877            DnsUpdater::Infoblox(provider) => provider.create(name, record, ttl, origin).await,
878            #[cfg(feature = "test_provider")]
879            DnsUpdater::Pebble(provider) => provider.create(name, record, ttl, origin).await,
880            #[cfg(feature = "test_provider")]
881            DnsUpdater::InMemory(provider) => provider.create(name, record, ttl, origin).await,
882            DnsUpdater::BluecatV2(provider) => provider.create(name, record, ttl, origin).await,
883            DnsUpdater::Ns1(provider) => provider.create(name, record, ttl, origin).await,
884            DnsUpdater::LuaDns(provider) => provider.create(name, record, ttl, origin).await,
885            DnsUpdater::ClouDns(provider) => provider.create(name, record, ttl, origin).await,
886            DnsUpdater::Glesys(provider) => provider.create(name, record, ttl, origin).await,
887            DnsUpdater::Dreamhost(provider) => provider.create(name, record, ttl, origin).await,
888            DnsUpdater::Domeneshop(provider) => provider.create(name, record, ttl, origin).await,
889            DnsUpdater::Safedns(provider) => provider.create(name, record, ttl, origin).await,
890            DnsUpdater::ArvanCloud(provider) => provider.create(name, record, ttl, origin).await,
891        }
892    }
893
894    /// Update an existing DNS record.
895    pub async fn update(
896        &self,
897        name: impl IntoFqdn<'_>,
898        record: DnsRecord,
899        ttl: u32,
900        origin: impl IntoFqdn<'_>,
901    ) -> crate::Result<()> {
902        match self {
903            DnsUpdater::Alidns(provider) => provider.update(name, record, ttl, origin).await,
904            DnsUpdater::AzureDns(provider) => provider.update(name, record, ttl, origin).await,
905            DnsUpdater::Bunny(provider) => provider.update(name, record, ttl, origin).await,
906            DnsUpdater::Cloudflare(provider) => provider.update(name, record, ttl, origin).await,
907            DnsUpdater::Ddnss(provider) => provider.update(name, record, ttl, origin).await,
908            DnsUpdater::Desec(provider) => provider.update(name, record, ttl, origin).await,
909            DnsUpdater::DigitalOcean(provider) => provider.update(name, record, ttl, origin).await,
910            DnsUpdater::DNSimple(provider) => provider.update(name, record, ttl, origin).await,
911            DnsUpdater::GandiV5(provider) => provider.update(name, record, ttl, origin).await,
912            DnsUpdater::Gcore(provider) => provider.update(name, record, ttl, origin).await,
913            DnsUpdater::Godaddy(provider) => provider.update(name, record, ttl, origin).await,
914            DnsUpdater::Hetzner(provider) => provider.update(name, record, ttl, origin).await,
915            DnsUpdater::Linode(provider) => provider.update(name, record, ttl, origin).await,
916            DnsUpdater::NameDotCom(provider) => provider.update(name, record, ttl, origin).await,
917            DnsUpdater::NameSilo(provider) => provider.update(name, record, ttl, origin).await,
918            DnsUpdater::DuckDns(provider) => provider.update(name, record, ttl, origin).await,
919            DnsUpdater::Dynu(provider) => provider.update(name, record, ttl, origin).await,
920            DnsUpdater::FreeMyIp(provider) => provider.update(name, record, ttl, origin).await,
921            DnsUpdater::Ipv64(provider) => provider.update(name, record, ttl, origin).await,
922            DnsUpdater::Constellix(provider) => provider.update(name, record, ttl, origin).await,
923            DnsUpdater::DnsMadeEasy(provider) => provider.update(name, record, ttl, origin).await,
924            DnsUpdater::Exoscale(provider) => provider.update(name, record, ttl, origin).await,
925            DnsUpdater::Nifcloud(provider) => provider.update(name, record, ttl, origin).await,
926            DnsUpdater::IbmCloud(provider) => provider.update(name, record, ttl, origin).await,
927            #[cfg(any(feature = "ring", feature = "aws-lc-rs"))]
928            DnsUpdater::Ovh(provider) => provider.update(name, record, ttl, origin).await,
929            #[cfg(any(feature = "ring", feature = "aws-lc-rs"))]
930            DnsUpdater::OracleCloud(provider) => provider.update(name, record, ttl, origin).await,
931            DnsUpdater::Porkbun(provider) => provider.update(name, record, ttl, origin).await,
932            DnsUpdater::Rfc2136(provider) => provider.update(name, record, ttl, origin).await,
933            DnsUpdater::Route53(provider) => provider.update(name, record, ttl, origin).await,
934            DnsUpdater::Scaleway(provider) => provider.update(name, record, ttl, origin).await,
935            DnsUpdater::Spaceship(provider) => provider.update(name, record, ttl, origin).await,
936            DnsUpdater::Vercel(provider) => provider.update(name, record, ttl, origin).await,
937            DnsUpdater::Vultr(provider) => provider.update(name, record, ttl, origin).await,
938            DnsUpdater::WebSupport(provider) => provider.update(name, record, ttl, origin).await,
939            DnsUpdater::TencentCloud(provider) => provider.update(name, record, ttl, origin).await,
940            DnsUpdater::Plesk(provider) => provider.update(name, record, ttl, origin).await,
941            DnsUpdater::Cpanel(provider) => provider.update(name, record, ttl, origin).await,
942            DnsUpdater::GoogleCloudDns(provider) => {
943                provider.update(name, record, ttl, origin).await
944            }
945            DnsUpdater::Ionos(provider) => provider.update(name, record, ttl, origin).await,
946            DnsUpdater::HostingDe(provider) => provider.update(name, record, ttl, origin).await,
947            DnsUpdater::Infomaniak(provider) => provider.update(name, record, ttl, origin).await,
948            DnsUpdater::Netcup(provider) => provider.update(name, record, ttl, origin).await,
949            DnsUpdater::Netlify(provider) => provider.update(name, record, ttl, origin).await,
950            DnsUpdater::EasyDns(provider) => provider.update(name, record, ttl, origin).await,
951            DnsUpdater::Joker(provider) => provider.update(name, record, ttl, origin).await,
952            DnsUpdater::MythicBeasts(provider) => provider.update(name, record, ttl, origin).await,
953            DnsUpdater::Namecheap(provider) => provider.update(name, record, ttl, origin).await,
954            #[cfg(any(feature = "ring", feature = "aws-lc-rs"))]
955            DnsUpdater::Transip(provider) => provider.update(name, record, ttl, origin).await,
956            DnsUpdater::HuaweiCloud(provider) => provider.update(name, record, ttl, origin).await,
957            DnsUpdater::BaiduCloud(provider) => provider.update(name, record, ttl, origin).await,
958            #[cfg(any(feature = "ring", feature = "aws-lc-rs"))]
959            DnsUpdater::Volcengine(provider) => provider.update(name, record, ttl, origin).await,
960            #[cfg(any(feature = "ring", feature = "aws-lc-rs"))]
961            DnsUpdater::YandexCloud(provider) => provider.update(name, record, ttl, origin).await,
962            DnsUpdater::Hurricane(provider) => provider.update(name, record, ttl, origin).await,
963            DnsUpdater::Hostinger(provider) => provider.update(name, record, ttl, origin).await,
964            DnsUpdater::Autodns(provider) => provider.update(name, record, ttl, origin).await,
965            DnsUpdater::Lightsail(provider) => provider.update(name, record, ttl, origin).await,
966            DnsUpdater::EdgeDns(provider) => provider.update(name, record, ttl, origin).await,
967            DnsUpdater::Inwx(provider) => provider.update(name, record, ttl, origin).await,
968            DnsUpdater::UltraDns(provider) => provider.update(name, record, ttl, origin).await,
969            DnsUpdater::Infoblox(provider) => provider.update(name, record, ttl, origin).await,
970            #[cfg(feature = "test_provider")]
971            DnsUpdater::Pebble(provider) => provider.update(name, record, ttl, origin).await,
972            #[cfg(feature = "test_provider")]
973            DnsUpdater::InMemory(provider) => provider.update(name, record, ttl, origin).await,
974            DnsUpdater::BluecatV2(provider) => provider.update(name, record, ttl, origin).await,
975            DnsUpdater::Ns1(provider) => provider.update(name, record, ttl, origin).await,
976            DnsUpdater::LuaDns(provider) => provider.update(name, record, ttl, origin).await,
977            DnsUpdater::ClouDns(provider) => provider.update(name, record, ttl, origin).await,
978            DnsUpdater::Glesys(provider) => provider.update(name, record, ttl, origin).await,
979            DnsUpdater::Dreamhost(provider) => provider.update(name, record, ttl, origin).await,
980            DnsUpdater::Domeneshop(provider) => provider.update(name, record, ttl, origin).await,
981            DnsUpdater::Safedns(provider) => provider.update(name, record, ttl, origin).await,
982            DnsUpdater::ArvanCloud(provider) => provider.update(name, record, ttl, origin).await,
983        }
984    }
985
986    /// Delete an existing DNS record.
987    pub async fn delete(
988        &self,
989        name: impl IntoFqdn<'_>,
990        origin: impl IntoFqdn<'_>,
991        record: DnsRecordType,
992    ) -> crate::Result<()> {
993        match self {
994            DnsUpdater::Alidns(provider) => provider.delete(name, origin, record).await,
995            DnsUpdater::AzureDns(provider) => provider.delete(name, origin, record).await,
996            DnsUpdater::Bunny(provider) => provider.delete(name, origin, record).await,
997            DnsUpdater::Cloudflare(provider) => provider.delete(name, origin, record).await,
998            DnsUpdater::Ddnss(provider) => provider.delete(name, origin, record).await,
999            DnsUpdater::Desec(provider) => provider.delete(name, origin, record).await,
1000            DnsUpdater::DigitalOcean(provider) => provider.delete(name, origin, record).await,
1001            DnsUpdater::DNSimple(provider) => provider.delete(name, origin, record).await,
1002            DnsUpdater::GandiV5(provider) => provider.delete(name, origin, record).await,
1003            DnsUpdater::Gcore(provider) => provider.delete(name, origin, record).await,
1004            DnsUpdater::Godaddy(provider) => provider.delete(name, origin, record).await,
1005            DnsUpdater::Hetzner(provider) => provider.delete(name, origin, record).await,
1006            DnsUpdater::Linode(provider) => provider.delete(name, origin, record).await,
1007            DnsUpdater::NameDotCom(provider) => provider.delete(name, origin, record).await,
1008            DnsUpdater::NameSilo(provider) => provider.delete(name, origin, record).await,
1009            DnsUpdater::DuckDns(provider) => provider.delete(name, origin, record).await,
1010            DnsUpdater::Dynu(provider) => provider.delete(name, origin, record).await,
1011            DnsUpdater::FreeMyIp(provider) => provider.delete(name, origin, record).await,
1012            DnsUpdater::Ipv64(provider) => provider.delete(name, origin, record).await,
1013            DnsUpdater::Constellix(provider) => provider.delete(name, origin, record).await,
1014            DnsUpdater::DnsMadeEasy(provider) => provider.delete(name, origin, record).await,
1015            DnsUpdater::Exoscale(provider) => provider.delete(name, origin, record).await,
1016            DnsUpdater::Nifcloud(provider) => provider.delete(name, origin, record).await,
1017            DnsUpdater::IbmCloud(provider) => provider.delete(name, origin, record).await,
1018            #[cfg(any(feature = "ring", feature = "aws-lc-rs"))]
1019            DnsUpdater::Ovh(provider) => provider.delete(name, origin, record).await,
1020            #[cfg(any(feature = "ring", feature = "aws-lc-rs"))]
1021            DnsUpdater::OracleCloud(provider) => provider.delete(name, origin, record).await,
1022            DnsUpdater::Porkbun(provider) => provider.delete(name, origin, record).await,
1023            DnsUpdater::Rfc2136(provider) => provider.delete(name, origin, record).await,
1024            DnsUpdater::Route53(provider) => provider.delete(name, origin, record).await,
1025            DnsUpdater::Scaleway(provider) => provider.delete(name, origin, record).await,
1026            DnsUpdater::Spaceship(provider) => provider.delete(name, origin, record).await,
1027            DnsUpdater::Vercel(provider) => provider.delete(name, origin, record).await,
1028            DnsUpdater::Vultr(provider) => provider.delete(name, origin, record).await,
1029            DnsUpdater::WebSupport(provider) => provider.delete(name, origin, record).await,
1030            DnsUpdater::TencentCloud(provider) => provider.delete(name, origin, record).await,
1031            DnsUpdater::Plesk(provider) => provider.delete(name, origin, record).await,
1032            DnsUpdater::Cpanel(provider) => provider.delete(name, origin, record).await,
1033            DnsUpdater::GoogleCloudDns(provider) => provider.delete(name, origin, record).await,
1034            DnsUpdater::Ionos(provider) => provider.delete(name, origin, record).await,
1035            DnsUpdater::HostingDe(provider) => provider.delete(name, origin, record).await,
1036            DnsUpdater::Infomaniak(provider) => provider.delete(name, origin, record).await,
1037            DnsUpdater::Netcup(provider) => provider.delete(name, origin, record).await,
1038            DnsUpdater::Netlify(provider) => provider.delete(name, origin, record).await,
1039            DnsUpdater::EasyDns(provider) => provider.delete(name, origin, record).await,
1040            DnsUpdater::Joker(provider) => provider.delete(name, origin, record).await,
1041            DnsUpdater::MythicBeasts(provider) => provider.delete(name, origin, record).await,
1042            DnsUpdater::Namecheap(provider) => provider.delete(name, origin, record).await,
1043            #[cfg(any(feature = "ring", feature = "aws-lc-rs"))]
1044            DnsUpdater::Transip(provider) => provider.delete(name, origin, record).await,
1045            DnsUpdater::HuaweiCloud(provider) => provider.delete(name, origin, record).await,
1046            DnsUpdater::BaiduCloud(provider) => provider.delete(name, origin, record).await,
1047            #[cfg(any(feature = "ring", feature = "aws-lc-rs"))]
1048            DnsUpdater::Volcengine(provider) => provider.delete(name, origin, record).await,
1049            #[cfg(any(feature = "ring", feature = "aws-lc-rs"))]
1050            DnsUpdater::YandexCloud(provider) => provider.delete(name, origin, record).await,
1051            DnsUpdater::Hurricane(provider) => provider.delete(name, origin, record).await,
1052            DnsUpdater::Hostinger(provider) => provider.delete(name, origin, record).await,
1053            DnsUpdater::Autodns(provider) => provider.delete(name, origin, record).await,
1054            DnsUpdater::Lightsail(provider) => provider.delete(name, origin, record).await,
1055            DnsUpdater::EdgeDns(provider) => provider.delete(name, origin, record).await,
1056            DnsUpdater::Inwx(provider) => provider.delete(name, origin, record).await,
1057            DnsUpdater::UltraDns(provider) => provider.delete(name, origin, record).await,
1058            DnsUpdater::Infoblox(provider) => provider.delete(name, origin, record).await,
1059            #[cfg(feature = "test_provider")]
1060            DnsUpdater::Pebble(provider) => provider.delete(name, origin, record).await,
1061            #[cfg(feature = "test_provider")]
1062            DnsUpdater::InMemory(provider) => provider.delete(name, origin, record).await,
1063            DnsUpdater::BluecatV2(provider) => provider.delete(name, origin, record).await,
1064            DnsUpdater::Ns1(provider) => provider.delete(name, origin, record).await,
1065            DnsUpdater::LuaDns(provider) => provider.delete(name, origin, record).await,
1066            DnsUpdater::ClouDns(provider) => provider.delete(name, origin, record).await,
1067            DnsUpdater::Glesys(provider) => provider.delete(name, origin, record).await,
1068            DnsUpdater::Dreamhost(provider) => provider.delete(name, origin, record).await,
1069            DnsUpdater::Domeneshop(provider) => provider.delete(name, origin, record).await,
1070            DnsUpdater::Safedns(provider) => provider.delete(name, origin, record).await,
1071            DnsUpdater::ArvanCloud(provider) => provider.delete(name, origin, record).await,
1072        }
1073    }
1074}