[][src]Crate versuch

Procedural macro polyfill for Ok-wrapping functions.

Try blocks are a nightly rust feature for introducing less-than-a-function boundary ? operator. One notable feature of try-blocks as currently implemented is ok-wrapping:

let x: Option<i32> = try { 92 };
assert!(x.is_some());

That is, try { expr } desugars to, roughtly, (|| Try::from_ok(expr))().

Crucially you still have to use ? to propagate erors, but you don't have to wrap the final value in Ok. Moreover, if the final value is already a Result, you need to add an extra ?, to make the errors even more explicit than without ok-wrapping.

The try-block syntax naturarly generalizes to functions:

fn word_count(path: &Path) -> io::Result<usize> try {
    let mut res = 0;
    let file = fs::File::open(path)?;
    let mut reader = io::BufReader::new(file);
    for line in reader.lines() {
        let line = line?;
        res += line.split_whitespace().count();
    }
    res
}

Unfortunatelly, we can't have exact that even with proc-macros, but this crate provides something close enough:

use versuch::try_fn;

#[try_fn]
fn word_count(path: &Path) -> io::Result<usize> {
    let mut res = 0;
    let file = fs::File::open(path)?;
    let mut reader = io::BufReader::new(file);
    for line in reader.lines() {
        let line = line?;
        res += line.split_whitespace().count();
    }
    res
}

This crate is very much inspired by the https://crates.io/crates/fehler crate.

Disclaimer: this crate is a proc macro and thus can measurably increase the number of dependencies and compile times. It also breaks IDE support (sorry for that, @matklad).

Attribute Macros

try_fn

Wraps the body of the function into Ok or Some.