#enums #monads #macro #options #result

result-like

Option/Result-like monad interface for your own enum

13 releases

Uses new Rust 2024

0.5.1 Sep 2, 2025
0.5.0 Dec 29, 2023
0.4.6 Feb 23, 2023
0.4.5 Aug 7, 2022
0.2.1 Jan 4, 2020

#203 in Rust patterns

Download history 2367/week @ 2025-07-29 2457/week @ 2025-08-05 1790/week @ 2025-08-12 2451/week @ 2025-08-19 4581/week @ 2025-08-26 5581/week @ 2025-09-02 4995/week @ 2025-09-09 5232/week @ 2025-09-16 4492/week @ 2025-09-23 4358/week @ 2025-09-30 3692/week @ 2025-10-07 4127/week @ 2025-10-14 4565/week @ 2025-10-21 6429/week @ 2025-10-28 4851/week @ 2025-11-04 4473/week @ 2025-11-11

21,293 downloads per month
Used in 10 crates (via rustpython-vm)

BSD-2-Clause-Views

13KB
99 lines

OptionLike and ResultLike

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

Define your own Option-like and Result-like enum types. Avoid reimplementing the entire APIs 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

~190–610KB
~15K SLoC