use aws_sdk_route53::types::{Change, ChangeAction, ChangeBatch, ResourceRecordSet}; use crate::result::Result; use crate::route53::Route53; pub enum ApplyMode { DryRun, Apply, } impl ApplyMode { pub async fn apply( &self, aws_context: &C, zone_id: &str, remove_records: R, insert_records: I, ) -> Result<()> where C: Route53, R: IntoIterator, I: IntoIterator, { match self { ApplyMode::DryRun => dry_run(zone_id, remove_records, insert_records).await, ApplyMode::Apply => apply(aws_context, zone_id, remove_records, insert_records).await, } } } async fn dry_run(zone_id: &str, remove_records: R, insert_records: I) -> Result<()> where R: IntoIterator, I: IntoIterator, { let remove_records: Vec<_> = remove_records.into_iter().collect(); let insert_records: Vec<_> = insert_records.into_iter().collect(); println!("ZONE: {}", zone_id); println!("REMOVE: {:#?}", remove_records); println!("INSERT: {:#?}", insert_records); Ok(()) } async fn apply( aws_context: &C, zone_id: &str, remove_records: R, insert_records: I, ) -> Result<()> where C: Route53, R: IntoIterator, I: IntoIterator, { let mut change_batch = ChangeBatch::builder(); for remove_record in remove_records { let change = Change::builder() .action(ChangeAction::Delete) .resource_record_set(remove_record) .build(); change_batch = change_batch.changes(change); } for insert_record in insert_records { let change = Change::builder() .action(ChangeAction::Create) .resource_record_set(insert_record) .build(); change_batch = change_batch.changes(change); } let change_batch = change_batch.build(); if let Some(changes) = change_batch.changes() { if !changes.is_empty() { aws_context .route53() .change_resource_record_sets() .hosted_zone_id(zone_id) .change_batch(change_batch) .send() .await?; } } Ok(()) }