This crate provides a convenient and simple way to implement the sealed trait pattern, as described in the Rust API Guidelines [1].
[dependencies]
sealed = "0.2.1"
In the following code structs A
and B
implement the sealed trait T
,
the C
struct, which is not sealed, will error during compilation.
Examples are available in examples/
, you can also see a demo in demo/
.
use sealed::sealed;
#[sealed]
trait T {}
pub struct A;
#[sealed]
impl T for A {}
pub struct B;
#[sealed]
impl T for B {}
pub struct C;
impl T for C {} // compile error
fn main() {
return
}
This is the list of attributes that can be used along #[sealed]
:
#[sealed]
: the main attribute macro, without attribute parameters.#[sealed(erase)]
: this option turns on bound erasure. This is useful when using the#[sealed]
macro inside a function. For an example, seebound-erasure-fn
.
The #[sealed]
attribute can be attached to either a trait
or an impl
.
It supports:
- Several traits per module
- Generic parameters
- Foreign types
- Blanket
impl
s
use sealed::sealed;
#[sealed]
pub trait T {}
pub struct A;
pub struct B(i32);
#[sealed]
impl T for A {}
#[sealed]
impl T for B {}
fn main() {
return;
}
use sealed::sealed;
pub(crate) mod __seal_t {
pub trait Sealed {}
}
pub trait T: __seal_t::Sealed {}
pub struct A;
pub struct B(i32);
impl __seal_t::Sealed for A {}
impl T for A {}
impl __seal_t::Sealed for B {}
impl T for B {}
fn main() {
return;
}