iex 0.2.0

Idiomatic exceptions
Documentation
use iex::{iex, Outcome};

trait FallibleSum {
    type Error;

    #[iex]
    fn add(self, other: Self) -> Result<Self, Self::Error>
    where
        Self: Sized;
}

impl FallibleSum for i32 {
    type Error = &'static str;

    #[iex]
    fn add(self, other: Self) -> Result<Self, Self::Error> {
        self.checked_add(other).ok_or("Integer overflow")
    }
}

#[test]
fn call_via_trait() {
    assert_eq!(FallibleSum::add(1, 2).into_result(), Ok(3));
    assert_eq!(
        FallibleSum::add(1, i32::MAX).into_result(),
        Err("Integer overflow")
    );
}

trait SayHello {
    #[iex]
    fn say_hello(self) -> Result<String, ()>
    where
        Self: Sized,
    {
        Ok(format!("Default implementation says Hello!"))
    }
}

impl SayHello for String {
    #[iex]
    fn say_hello(self) -> Result<String, ()> {
        Ok(self)
    }
}

impl SayHello for &str {
    #[allow(refining_impl_trait)]
    fn say_hello(self) -> Result<String, ()> {
        Ok(self.to_string())
    }
}

#[test]
fn refined() {
    assert_eq!(
        "test".to_string().say_hello().into_result().unwrap(),
        "test",
    );
    assert_eq!("test".say_hello().into_result().unwrap(), "test");
}