Skip to main content

cloudflare_dns/tasks/
delete_task.rs

1/// Delete DNS record task with parameter object.
2use iocraft::prelude::*;
3use std::sync::Arc;
4
5use crate::api::CloudflareClient;
6use crate::ui::state::{AppState, AppView};
7use crate::utils::{extract_unique_ips, format_records};
8
9/// Parameters for the delete task.
10pub struct DeleteParams {
11    pub client: Arc<CloudflareClient>,
12    pub state: Arc<AppState>,
13    pub record_id: String,
14    pub record_name: String,
15    pub record_type: String,
16    pub view: State<AppView>,
17    pub is_deleting: State<bool>,
18    pub status: State<String>,
19    pub records_display: State<String>,
20}
21
22/// Execute a DNS record deletion with automatic refresh on success.
23pub async fn delete_task(mut params: DeleteParams) {
24    match params.client.delete_dns_record(&params.record_id).await {
25        Ok(_) => {
26            // Invalidate cache after successful deletion
27            params.state.dns_cache.lock().unwrap().invalidate();
28
29            params.status.set(format!(
30                "Deleted {} ({})",
31                params.record_name, params.record_type
32            ));
33            params.view.set(AppView::List);
34            params.is_deleting.set(false);
35
36            if let Ok(f) = params.client.list_dns_records().await {
37                params.records_display.set(format_records(&f));
38                *params.state.existing_ips.lock().unwrap() = extract_unique_ips(&f);
39                *params.state.records.lock().unwrap() = f.clone();
40                params.state.dns_cache.lock().unwrap().set(f);
41            } else {
42                params.status.set(format!(
43                    "Deleted {} ({}), but refresh failed — press R to reload",
44                    params.record_name, params.record_type
45                ));
46            }
47        }
48        Err(e) => {
49            params.status.set(format!("Failed: {}", e));
50            params.is_deleting.set(false);
51        }
52    }
53}