42 lines
1.2 KiB
Rust
42 lines
1.2 KiB
Rust
use clap::Parser;
|
|||
|
|
use std::io::Write;
|
||
|
|
|
||
|
|
use brush_core::{ExecutionExitCode, ExecutionResult, arithmetic::Evaluatable, builtins};
|
||
|
|
|
||
|
|
/// Evaluate arithmetic expressions.
|
||
|
|
#[derive(Parser)]
|
||
|
|
pub(crate) struct LetCommand {
|
||
|
|
/// Arithmetic expressions to evaluate.
|
||
|
|
#[arg(trailing_var_arg = true, allow_hyphen_values = true)]
|
||
|
|
exprs: Vec<String>,
|
||
|
|
}
|
||
|
|
|
||
|
|
impl builtins::Command for LetCommand {
|
||
|
|
type Error = brush_core::Error;
|
||
|
|
|
||
|
|
async fn execute<SE: brush_core::ShellExtensions>(
|
||
|
|
&self,
|
||
|
|
context: brush_core::ExecutionContext<'_, SE>,
|
||
|
|
) -> Result<brush_core::ExecutionResult, Self::Error> {
|
||
|
|
let mut result = ExecutionExitCode::InvalidUsage.into();
|
||
|
|
|
||
|
|
if self.exprs.is_empty() {
|
||
|
|
writeln!(context.stderr(), "missing expression")?;
|
||
|
|
return Ok(result);
|
||
|
|
}
|
||
|
|
|
||
|
|
for expr in &self.exprs {
|
||
|
|
let parsed = brush_parser::arithmetic::parse(expr.as_str())?;
|
||
|
|
let evaluated = parsed.eval(context.shell)?;
|
||
|
|
|
||
|
|
if evaluated == 0 {
|
||
|
|
result = ExecutionResult::general_error();
|
||
|
|
} else {
|
||
|
|
result = ExecutionResult::success();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
Ok(result)
|
||
|
|
}
|
||
|
|
}
|