use super::sync_report::apply_sync_report;
use super::{default_identity, discover};
use balls::error::Result;
use balls::store::Store;
use balls::{human_gate, plugin};
use std::fs;
pub fn stage_sync_event(remote: &str, task_filter: Option<&str>) -> Result<()> {
let _ = remote; let store = discover()?;
let ident = default_identity();
dispatch_and_stage(&store, task_filter, &ident);
eprintln!("sync complete");
Ok(())
}
fn dispatch_and_stage(store: &Store, task_filter: Option<&str>, ident: &str) {
match plugin::dispatch_sync(store, task_filter, ident) {
Ok(reports) => {
for (plugin_name, report) in reports {
match human_gate::stage_sync(store, &plugin_name, &report) {
Ok(id) => eprintln!("staged plugin {plugin_name} sync report at {id}"),
Err(e) => eprintln!("warning: stage {plugin_name} failed: {e}"),
}
}
}
Err(e) => eprintln!("warning: plugin sync failed: {e}"),
}
}
pub fn apply_staged(id: &str) -> Result<()> {
let store = discover()?;
let entry = human_gate::load_staged(&store, id)?;
apply_sync_report(&store, &entry.data.plugin, &entry.data.report);
fs::remove_file(&entry.path)?;
eprintln!(
"applied staged {} report from plugin {}",
entry.data.event, entry.data.plugin
);
Ok(())
}
pub fn discard_staged(id: &str) -> Result<()> {
let store = discover()?;
let (event, plugin) = human_gate::discard_staged(&store, id)?;
eprintln!("discarded staged {event} report from plugin {plugin}");
Ok(())
}
pub fn list_staged() -> Result<()> {
let store = discover()?;
let entries = human_gate::list_staged(&store)?;
if entries.is_empty() {
println!("(no staged sync reports)");
return Ok(());
}
for e in &entries {
let r = &e.data.report;
println!(
"{} {} {} created={} updated={} deleted={}",
e.id,
e.data.event,
e.data.plugin,
r.created.len(),
r.updated.len(),
r.deleted.len(),
);
}
Ok(())
}