summaryrefslogtreecommitdiff
path: root/src/apply.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/apply.rs')
-rw-r--r--src/apply.rs87
1 files changed, 87 insertions, 0 deletions
diff --git a/src/apply.rs b/src/apply.rs
new file mode 100644
index 0000000..86e92b4
--- /dev/null
+++ b/src/apply.rs
@@ -0,0 +1,87 @@
+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<C, R, I>(
+ &self,
+ aws_context: &C,
+ zone_id: &str,
+ remove_records: R,
+ insert_records: I,
+ ) -> Result<()>
+ where
+ C: Route53,
+ R: IntoIterator<Item = ResourceRecordSet>,
+ I: IntoIterator<Item = ResourceRecordSet>,
+ {
+ 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<R, I>(zone_id: &str, remove_records: R, insert_records: I) -> Result<()>
+where
+ R: IntoIterator<Item = ResourceRecordSet>,
+ I: IntoIterator<Item = ResourceRecordSet>,
+{
+ 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<C, R, I>(
+ aws_context: &C,
+ zone_id: &str,
+ remove_records: R,
+ insert_records: I,
+) -> Result<()>
+where
+ C: Route53,
+ R: IntoIterator<Item = ResourceRecordSet>,
+ I: IntoIterator<Item = ResourceRecordSet>,
+{
+ 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(())
+}