#cast #safe #type #as #safe-cast #casting-as-type

safecast

Traits to define safe casting between types

9 releases

0.2.3 Aug 13, 2024
0.2.2 Dec 20, 2023
0.2.1 Sep 3, 2023
0.2.0 Jul 3, 2023
0.1.1 Jan 5, 2021

#501 in Rust patterns

Download history 22/week @ 2024-12-21 25/week @ 2024-12-28 133/week @ 2025-01-04 157/week @ 2025-01-11 210/week @ 2025-01-18 190/week @ 2025-01-25 253/week @ 2025-02-01 428/week @ 2025-02-08 260/week @ 2025-02-15 196/week @ 2025-02-22 176/week @ 2025-03-01 143/week @ 2025-03-08 221/week @ 2025-03-15 158/week @ 2025-03-22 155/week @ 2025-03-29 46/week @ 2025-04-05

606 downloads per month
Used in 29 crates (22 directly)

Apache-2.0

12KB
191 lines

safecast

Rust traits to define safe casting between types.

Example usage:

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,
        }
    }
}

No runtime deps