use anyhow::Result; use aws_sdk_route53::types::{Change, ChangeAction, ChangeBatch, ResourceRecordSet}; // Needed until try_collect is stable, see use itertools::Itertools; 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 remove_records = remove_records.into_iter().map(|record| { Change::builder() .action(ChangeAction::Delete) // <-- .resource_record_set(record) .build() }); let insert_records = insert_records.into_iter().map(|record| { Change::builder() .action(ChangeAction::Create) // <-- .resource_record_set(record) .build() }); let change_records: Vec<_> = remove_records.chain(insert_records).try_collect()?; if !change_records.is_empty() { let change_batch = ChangeBatch::builder() .set_changes(Some(change_records)) .build()?; aws_context .route53() .change_resource_record_sets() .hosted_zone_id(zone_id) .change_batch(change_batch) .send() .await?; } Ok(()) }