use std::collections::HashSet; use std::fmt::Debug; use anyhow::Result; use futures::try_join; use crate::apply::{Changes, Transaction}; use crate::autoscaling::{propose_asg_recordsets, AutoScaling}; use crate::ec2::Ec2; use crate::route53::{zone_actual_recordsets, zone_for_name, ResourceRecordSet, Route53, Target}; pub async fn propose_transaction( aws_context: &C, target: &Target, asg_name: &str, ) -> Result + Debug>> where C: AutoScaling + Ec2 + Route53, { let zone = zone_for_name(aws_context, target.name()).await?; let (proposed, actual) = try_join!( propose_asg_recordsets(aws_context, target, asg_name), zone_actual_recordsets(aws_context, &zone.id, target.name()), )?; let changes = propose_changes(&proposed, &actual); let transaction = Transaction { zone_id: zone.id().into(), changes, }; Ok(transaction) } fn propose_changes( intended: &HashSet, actual: &HashSet, ) -> Changes + Debug> where T: std::hash::Hash + Eq + Clone + Debug, { let remove: Vec<_> = actual.difference(intended).cloned().collect(); let insert: Vec<_> = intended.difference(actual).cloned().collect(); Changes { remove, insert } }