openpql-runner 0.1.4

A high-performance Rust implementation of Poker Query Language (PQL), enabling SQL-like queries for poker analysis and calculations. This project is a spiritual successor to the original Java implementation developed by Odds Oracle.
Documentation
use super::*;

pub fn push_unary_op(
    data: &mut CompilerData,
    op: ast::UnaryOp,
    start: usize,
    arg: &ast::Expr,
) -> PQLResult<PQLType> {
    let arg_type = push_expr(data, arg, PQLType::all())?;

    let loc = (start, arg.loc().1);
    let op = VmUnaryOp::from(op);

    match op.resolve_type(arg_type) {
        Ok(rtn_type) => {
            data.prog.push((VmInstruction::UnaryOp(op), loc));

            Ok(rtn_type)
        }
        Err(err) => Err(mk_err(&loc, err)),
    }
}

#[cfg(test)]
#[cfg_attr(coverage_nightly, coverage(off))]
mod tests {
    use super::*;
    use crate::*;

    #[test]
    fn test_not() {
        let expr = parse_expr("not 1 = 1").unwrap();
        let mut data = CompilerData::default();
        let tp = push_expr(&mut data, &expr, PQLType::BOOLEAN).unwrap();

        assert_eq!(tp, PQLType::BOOLEAN);
        assert_eq!(
            data.prog.last().map(|(ins, _)| ins.clone()),
            Some(VmInstruction::UnaryOp(VmUnaryOpLogic::Not.into())),
        );
    }

    #[test]
    fn test_not_err() {
        assert_expr_err(
            PQLType::BOOLEAN,
            "not 1",
            PQLErrorKind::LogicalOperationUnsupported {
                lhs: PQLType::LONG,
                rhs: PQLType::LONG,
            },
            "not 1",
        );
    }
}