use nu_engine::CallExt;
use nu_protocol::{
engine::{Call, Command, EngineState, Stack},
PipelineData, ShellError, Signature, SyntaxShape, Type, Value,
};
use zenoh::Wait;
use crate::{cmd::liveliness::LivelinessTokenValue, signature_ext::SignatureExt, State};
#[derive(Clone)]
pub(crate) struct UndeclareToken {
_state: State,
}
impl UndeclareToken {
pub(crate) fn new(state: State) -> Self {
Self { _state: state }
}
}
impl Command for UndeclareToken {
fn name(&self) -> &str {
"zenoh liveliness undeclare-token"
}
fn signature(&self) -> nu_protocol::Signature {
Signature::build(self.name())
.session()
.zenoh_category()
.input_output_type(Type::Nothing, Type::list(Type::record()))
.required("token", SyntaxShape::Any, "liveliness token")
.allowed_origin()
}
fn description(&self) -> &str {
"Undeclare a liveliness token"
}
fn run(
&self,
engine_state: &EngineState,
stack: &mut Stack,
call: &Call,
_input: PipelineData,
) -> Result<PipelineData, ShellError> {
let token_value = call.req::<Value>(engine_state, stack, 0)?;
let mut custom_value = token_value.into_custom_value()?;
let mut token_lock = custom_value
.as_mut_any()
.downcast_mut::<LivelinessTokenValue>()
.unwrap()
.handle
.lock()
.unwrap();
if let Some(token) = token_lock.take() {
token.undeclare().wait().unwrap();
}
Ok(PipelineData::Empty)
}
}