use super::Router;
use crate::channel_types::SmallSender;
use crate::{
error::{NodeError, NodeReason},
NodeReplyResult, RouterReply,
};
use ockam_core::{Address, Result};
pub(super) async fn exec(
router: &mut Router,
addr: &Address,
detached: bool,
reply: &SmallSender<NodeReplyResult>,
) -> Result<()> {
trace!("Stopping worker '{}'", addr);
let primary_address = match router.map.get_primary_address(addr) {
Some(p) => p.clone(),
None => {
reply
.send(RouterReply::no_such_address(addr.clone()))
.await
.map_err(|_| NodeError::NodeState(NodeReason::Unknown).internal())?;
return Ok(());
}
};
let record = match router.map.get_address_record_mut(&primary_address) {
Some(r) => r,
None => {
reply
.send(RouterReply::no_such_address(addr.clone()))
.await
.map_err(|_| NodeError::NodeState(NodeReason::Unknown).internal())?;
return Ok(());
}
};
reply
.send(RouterReply::ok())
.await
.map_err(|_| NodeError::NodeState(NodeReason::Unknown).internal())?;
if !detached {
record.drop_sender();
} else {
router.map.free_address(primary_address);
}
Ok(())
}