#option #result #monad #macro #enum

result-like

Option/Result-like monad interface for your own enum

11 releases

0.4.6 Feb 23, 2023
0.4.5 Aug 7, 2022
0.4.3 Jun 7, 2022
0.4.2 Oct 26, 2021
0.1.0 Jan 4, 2020

#257 in Rust patterns

Download history 1133/week @ 2022-11-28 1408/week @ 2022-12-05 659/week @ 2022-12-12 1251/week @ 2022-12-19 425/week @ 2022-12-26 840/week @ 2023-01-02 1671/week @ 2023-01-09 735/week @ 2023-01-16 2392/week @ 2023-01-23 1012/week @ 2023-01-30 714/week @ 2023-02-06 821/week @ 2023-02-13 1790/week @ 2023-02-20 1857/week @ 2023-02-27 1916/week @ 2023-03-06 1783/week @ 2023-03-13

7,485 downloads per month
Used in 2 crates (via rustpython-vm)

BSD-2-Clause

11KB
96 lines

OptionLike and ResultLike

Install: https://crates.io/crates/result-like

Define your own Option-like and Result-like enum types. Avoid to reimplement everything of option and result for your own enums.

Option example

use result_like::OptionLike;

// Simple case with single argument name to use Some and None
#[derive(OptionLike)]
enum MyOption<T> {
    Some(T),
    None,
}

let v = MyOption::Some(1);
// every option utilities are possible including unwrap, map, and, or etc.
assert_eq!(v.unwrap(), 1);

// convertable to option
let opt = v.into_option();
assert_eq!(opt, Some(1));

// enum with custom names instead of Some and None
#[derive(OptionLike)]
enum Number {
    Value(i64),
    Nan,
}

let v = Number::Value(10);
assert_ne!(v, Number::Nan);

Result example in same way

use result_like::ResultLike;

// typical
#[derive(ResultLike)]
enum MyResult<T, E> {
    Ok(T),
    Err(E),
}

// value-only
#[derive(ResultLike)]
enum Trial {
    Success(String),
    Failure(String),
}

Dependencies

~0.7–1.1MB
~27K SLoC