#safe #cast #type #foo-bar #as

安全测量

定义类型之间安全转换的特质

9 个版本

0.2.3 2024 年 8 月 13 日
0.2.2 2023 年 12 月 20 日
0.2.1 2023 年 9 月 3 日
0.2.0 2023 年 7 月 3 日
0.1.1 2021 年 1 月 5 日

#779 in Rust 模式

Download history · Rust 包仓库 44/week @ 2024-05-02 · Rust 包仓库 45/week @ 2024-05-09 · Rust 包仓库 58/week @ 2024-05-16 · Rust 包仓库 69/week @ 2024-05-23 · Rust 包仓库 103/week @ 2024-05-30 · Rust 包仓库 53/week @ 2024-06-06 · Rust 包仓库 58/week @ 2024-06-13 · Rust 包仓库 72/week @ 2024-06-20 · Rust 包仓库 31/week @ 2024-06-27 · Rust 包仓库 38/week @ 2024-07-04 · Rust 包仓库 56/week @ 2024-07-11 · Rust 包仓库 71/week @ 2024-07-18 · Rust 包仓库 87/week @ 2024-07-25 · Rust 包仓库 66/week @ 2024-08-01 · Rust 包仓库 227/week @ 2024-08-08 · Rust 包仓库 79/week @ 2024-08-15 · Rust 包仓库

每月 460 次下载
用于 27 个 crate (21 直接)

Apache-2.0

12KB
191

安全测量

Rust 特质,用于定义类型之间的安全转换。

示例用法

use safecast::*;

struct Foo {
    a: i32,
}

struct Bar {
    b: u16,
}

enum Baz {
    Foo(Foo),
    Bar(Bar),
}

impl CastFrom<Bar> for Foo {
    fn cast_from(bar: Bar) -> Self {
        Foo { a: bar.b as i32 }
    }
}

impl TryCastFrom<Foo> for Bar {
    fn can_cast_from(foo: &Foo) -> bool {
        foo.a >= 0 && foo.a <= u16::MAX
    }

    fn opt_cast_from(foo: Foo) -> Option<Self> {
        if foo.a >= 0 && foo.a <= u16::MAX {
            Some(Self { b: foo.a as u16 })
        } else {
            None
        }
    }
}

impl AsType<Foo> for Baz {
    fn as_type(&self) -> Option<&Foo> {
        match self {
            Self::Foo(foo) => Some(foo),
            _ => None,
        }
    }

    fn as_type_mut(&mut self) -> Option<&mut Foo> {
        match self {
            Self::Foo(foo) => Some(foo),
            _ => None,
        }
    }

    fn into_type(self) -> Option<Foo> {
        match self {
            Self::Foo(foo) => Some(foo),
            _ => None,
        }
    }
}

无运行时依赖