iex 0.2.0

Idiomatic exceptions
Documentation
use iex::{iex, Outcome};
use std::marker::PhantomData;

#[iex]
fn input_lifetimes<'a, 'b>(_x: &'a u32, _y: &'b u32) -> Result<(), ()> {
    Ok(())
}

#[iex]
fn output_lifetime<'a>() -> Result<&'a u32, ()> {
    Err(())
}

#[iex]
fn elided_input_lifetimes(_x: &u32, _y: &u32) -> Result<(), ()> {
    Ok(())
}

struct A<'a>(PhantomData<&'a ()>);

#[iex]
fn elided_input_lifetime_struct(_a: A<'_>) -> Result<(), ()> {
    Ok(())
}

#[iex]
fn max_length<'a>(a: &'a str, b: &'a str) -> Result<&'a str, &'static str> {
    if a.len() > b.len() {
        Ok(a)
    } else if a.len() < b.len() {
        Ok(b)
    } else {
        Err("Same length!")
    }
}

#[iex]
fn swap<'a, T>(a: &'a mut T, b: &'a mut T) -> Result<(), String> {
    std::mem::swap(a, b);
    Ok(())
}

#[test]
fn lifetimes() {
    assert_eq!(input_lifetimes(&1, &2).into_result(), Ok(()));
    assert_eq!(output_lifetime().into_result(), Err(()));
    assert_eq!(elided_input_lifetimes(&1, &2).into_result(), Ok(()));
    assert_eq!(
        elided_input_lifetime_struct(A(PhantomData)).into_result(),
        Ok(())
    );
    assert_eq!(max_length("Hello, ", "world!").into_result(), Ok("Hello, "));
}

#[test]
fn mutability() {
    let mut x = 1;
    let mut y = 2;
    assert_eq!(swap(&mut x, &mut y).into_result(), Ok(()));
    assert_eq!(x, 2);
    assert_eq!(y, 1);
}