use nu_protocol::{ast::Call, engine::EvaluationContext, ShellError}; use crate::{eval_expression, FromValue}; pub trait CallExt { fn get_flag( &self, context: &EvaluationContext, name: &str, ) -> Result, ShellError>; fn rest( &self, context: &EvaluationContext, starting_pos: usize, ) -> Result, ShellError>; fn opt( &self, context: &EvaluationContext, pos: usize, ) -> Result, ShellError>; fn req(&self, context: &EvaluationContext, pos: usize) -> Result; } impl CallExt for Call { fn get_flag( &self, context: &EvaluationContext, name: &str, ) -> Result, ShellError> { if let Some(expr) = self.get_flag_expr(name) { let result = eval_expression(context, &expr)?; FromValue::from_value(&result).map(Some) } else { Ok(None) } } fn rest( &self, context: &EvaluationContext, starting_pos: usize, ) -> Result, ShellError> { let mut output = vec![]; for expr in self.positional.iter().skip(starting_pos) { let result = eval_expression(context, expr)?; output.push(FromValue::from_value(&result)?); } Ok(output) } fn opt( &self, context: &EvaluationContext, pos: usize, ) -> Result, ShellError> { if let Some(expr) = self.nth(pos) { let result = eval_expression(context, &expr)?; FromValue::from_value(&result).map(Some) } else { Ok(None) } } fn req(&self, context: &EvaluationContext, pos: usize) -> Result { if let Some(expr) = self.nth(pos) { let result = eval_expression(context, &expr)?; FromValue::from_value(&result) } else { Err(ShellError::AccessBeyondEnd( self.positional.len(), self.head, )) } } }