use std::time::Instant;
use crate::app::{self, App};
use crate::providers;
pub(crate) fn handle_sync_progress(app: &mut App, provider: String, message: String) {
if app.providers.syncing().contains_key(&provider) && app.providers.sync_done().is_empty() {
let name = providers::provider_display_name(&provider);
let spinner = crate::animation::SPINNER_FRAMES[0];
app.notify_background(crate::messages::provider_progress(spinner, name, &message));
}
}
pub(crate) fn handle_sync_complete(
app: &mut App,
provider: String,
hosts: Vec<crate::providers::ProviderHost>,
last_config_check: &mut Instant,
) {
let now = std::time::SystemTime::now()
.duration_since(std::time::UNIX_EPOCH)
.unwrap_or_default()
.as_secs();
let display_name = providers::provider_display_name(&provider);
let before_aliases = app.snapshot_alias_set();
let (_msg, is_err, total, added, updated, stale) =
app.apply_sync_result(&provider, hosts, false);
if is_err {
app.providers.record_sync(
provider.clone(),
app::SyncRecord {
timestamp: now,
message: format!("{}: sync failed", display_name),
is_error: true,
},
);
app.providers.set_sync_had_errors(true);
} else {
let label = if total == 1 { "server" } else { "servers" };
let message = format!(
"{} {}{}",
total,
label,
crate::format_sync_diff(added, updated, stale)
);
app.providers.record_sync(
provider.clone(),
app::SyncRecord {
timestamp: now,
message,
is_error: false,
},
);
app.providers.add_batch_diff(added, updated, stale);
}
app.providers.syncing_mut().remove(&provider);
app.providers.push_sync_done(display_name.to_string());
crate::set_sync_summary(app);
*last_config_check = Instant::now();
app.queue_new_aliases_since(&before_aliases);
}
pub(crate) fn handle_sync_partial(
app: &mut App,
provider: String,
hosts: Vec<crate::providers::ProviderHost>,
failures: usize,
total: usize,
last_config_check: &mut Instant,
) {
let now = std::time::SystemTime::now()
.duration_since(std::time::UNIX_EPOCH)
.unwrap_or_default()
.as_secs();
let display_name = providers::provider_display_name(provider.as_str());
let before_aliases = app.snapshot_alias_set();
let (msg, is_err, synced, added, updated, stale) =
app.apply_sync_result(&provider, hosts, true);
if is_err {
app.providers.record_sync(
provider.clone(),
app::SyncRecord {
timestamp: now,
message: msg,
is_error: true,
},
);
} else {
let label = if synced == 1 { "server" } else { "servers" };
app.providers.record_sync(
provider.clone(),
app::SyncRecord {
timestamp: now,
message: format!(
"{} {}{} ({} of {} failed)",
synced,
label,
crate::format_sync_diff(added, updated, stale),
failures,
total
),
is_error: true,
},
);
app.providers.add_batch_diff(added, updated, stale);
}
app.providers.set_sync_had_errors(true);
app.providers.syncing_mut().remove(&provider);
app.providers.push_sync_done(display_name.to_string());
crate::set_sync_summary(app);
*last_config_check = Instant::now();
app.queue_new_aliases_since(&before_aliases);
}
pub(crate) fn handle_sync_error(
app: &mut App,
provider: String,
message: String,
last_config_check: &mut Instant,
) {
let now = std::time::SystemTime::now()
.duration_since(std::time::UNIX_EPOCH)
.unwrap_or_default()
.as_secs();
let display_name = providers::provider_display_name(provider.as_str());
app.providers.record_sync(
provider.clone(),
app::SyncRecord {
timestamp: now,
message: message.clone(),
is_error: true,
},
);
app.providers.set_sync_had_errors(true);
app.providers.syncing_mut().remove(&provider);
app.providers.push_sync_done(display_name.to_string());
crate::set_sync_summary(app);
*last_config_check = Instant::now();
}