10个版本 (5个破坏性更新)

0.5.2 2021年4月4日
0.5.1 2021年2月18日
0.5.0 2020年11月2日
0.4.0 2020年6月28日
0.1.0 2018年11月21日

#1793 in Rust模式

Download history 20/week @ 2024-03-11 17/week @ 2024-03-18 21/week @ 2024-03-25 27/week @ 2024-04-01 16/week @ 2024-04-08 9/week @ 2024-04-15 32/week @ 2024-04-22 18/week @ 2024-04-29 5/week @ 2024-05-06 14/week @ 2024-05-13 32/week @ 2024-05-20 18/week @ 2024-05-27 16/week @ 2024-06-03 22/week @ 2024-06-10 15/week @ 2024-06-17 26/week @ 2024-06-24

79 个月下载量
4 个crate中使用 (2个直接使用)

MIT 许可证

64KB
1K SLoC

动机

在Rust中模拟检查异常。

用法

  1. 将此crate添加到Cargo.toml中,并启用您想要的任何功能

Cargo.toml:

[dependencies.enumx]
version = "0.4"

[dependencies.cex]
version = "0.5"

如果您想支持回溯,请添加此内容

features = ["log","pretty_log"]

src/lib.rs:

use enumx::export::*;
use enumx::predefined::*; // or use your own enum types at your will.
use cex::*;

功能

  1. 作为检查异常的ad-hoc枚举。

  2. 回溯。

  3. 类型作为模式。

  4. 回退作为 impl Trait

文档

有关更多信息,请参阅 enumx 书籍

许可证

MIT许可。


lib.rs:

Rust的检查异常。

有关更多信息,请参阅 enumx 书籍

功能

  1. 使用 Result!( Type throws A,B,.. )ret!()throw!() 在Rust中模拟检查异常

  2. #[ty_pat] match 用于match表达式中的“类型作为模式匹配”。

  3. 可选回溯支持。

  4. 回退作为 impl std::error::Error

示例

use enumx::export::*;
use enumx::predefined::*;
use cex::*;

// accepts even numbers; rejects odd ones and report an error `String`
#[cex]
fn check_even( a: u32 ) -> Result!( u32 throws String ) {
    if a % 2 == 1 {
        throw!( format!( "odd numbers not allowed: a == {}", a ));
    } else {
        ret!( a );
    }
}

// accepts non-zero numbers; rejects zeros and report an error of `&'static str`
#[cex]
fn check_nonzero( b: u32 ) -> Result!( u32 throws &'static str ) {
    if b == 0 {
        throw!( "zero not allowed: b == 0" );
    } else {
        ret!( b )
    }
}

struct Underflow;

#[cex]
fn sub( a: u32, b: u32 ) -> Result!( u32 throws String, &'static str, Underflow ) {
    let a = check_even( a )?;
    let b = check_nonzero( b )?;
    ret!( a+b );
}

#[cex]
fn distance( a: u32, b: u32 ) -> Result!( u32 throws String, &'static str ) {
    ret!( sub(a,b).or_else( |err| {#[ty_pat] match err {
        Underflow => ret!( b-a ),
        String(s) => throw!( s ),
        TyPat::<&'static str>(s) => throw!( s ),
    }}))
}

#[cex]
fn distance2( a: u32, b: u32 ) -> Result!( u32 throws String, &'static str ) {
    ret!( sub(a,b).or_else( |err| #[ty_pat(gen_throws)] match err {
        Underflow => ret!( b-a ),
    }))
}

#[cex]
fn distance3( a: u32, b: u32 ) -> Result!( u32 throws String, &'static str ) {
    ret!( sub(a,b).or_else( |err| #[ty_pat(gen &'static str, String )] match err {
        Underflow => ret!( b-a ),
    }))
}

依赖关系

~2.5MB
~51K SLoC