#arithmetic #checked #overflow #no-panic #proc-macro #no-alloc

macro no-std smooth-operator-impl

Procedural macro that transforms regular infix arithmetic expressions into checked arithmetic expressions

1 unstable release

new 0.7.2 Dec 13, 2024

#7 in #no-panic

Download history 158/week @ 2024-12-10

158 downloads per month
Used in smooth-operator

MIT license

14KB
247 lines

smooth-operator

Procedural macro that transforms regular infix arithmetic expressions into checked arithmetic expressions.

Example

The following invocation of checked!():

fn the_answer() -> Result<i32, Error> {
    let answer = checked!(410 / 10 + 1)?;
    Ok(answer)
}

Results in this output:

fn the_answer() -> Result<i32, Error> {
    let answer = (|| -> ::core::result::Result<_, crate::Error> {
        type Err = crate::Error;
        const ORIGINAL_EXPR: &'static str = "410 / 10 + 1";
        Ok(
            #[allow(clippy::needless_question_mark)]
            #[allow(unused_parens)]
            {
                410.checked_div(10)
                    .ok_or(Err {
                        expr: ORIGINAL_EXPR,
                        __op_ix: 5usize,
                        __op_len: 1usize,
                    })?
                    .checked_add(1)
                    .ok_or(Err {
                        expr: ORIGINAL_EXPR,
                        __op_ix: 10usize,
                        __op_len: 1usize,
                    })?
            },
        )
    })()?;
    Ok(answer)
}

Dependencies

~205–640KB
~15K SLoC