aboutsummaryrefslogtreecommitdiff
path: root/native/thulani_calc/src/lib.rs
blob: 23a8aea8462734d1fe9bbbea54d6ba3c7faf7ee3 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
use rustler::Encoder;

rustler::atoms! {
    ok,
    error,
    inf,
    ninf,
    nan,
}

#[rustler::nif]
pub fn eval<'a>(env: rustler::Env<'a>, args: String) -> Result<rustler::Term<'a>, String> {
    thulani_calc::Calc::eval(&args)
        .map(|x| match x {
            x if x.is_infinite() && x.is_sign_positive() => inf().encode(env),
            x if x.is_infinite() && x.is_sign_negative() => ninf().encode(env),
            x if x.is_nan() => nan().encode(env),
            x => x.encode(env),
        })
        .map_err(|e| e.to_string())
}

rustler::init!("Elixir.Thulani.Calc");