use std::sync::atomic::Ordering;
use std::sync::Arc;
use super::DaemonState;
use crate::session::wire::{DaemonFrame, RefuseReason};
pub async fn reload_extension(state: &Arc<DaemonState>, extension: &str) -> DaemonFrame {
if state.reloading.load(Ordering::SeqCst) {
return DaemonFrame::Refused { reason: RefuseReason::Busy, message: "daemon reloading; retry in a moment".into() };
}
let mut manager = state.host.ext_manager().write().await;
let was_loaded = manager.is_loaded(extension);
match manager.reload_from_disk(extension).await {
Ok(report) => DaemonFrame::ExtensionReloaded { report },
Err(failure) => DaemonFrame::ExtensionReloadFailed {
extension: extension.to_string(),
message: failure.concise_message(),
unloaded: was_loaded && !manager.is_loaded(extension),
},
}
}