#[sealed]
This crate provides a convenient and simple way to implement the sealed trait pattern, as described in the Rust API Guidelines [1].
toml
[dependencies]
sealed = "0.3"
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/
.
```rust use sealed::sealed;
trait T {}
pub struct A;
impl T for A {}
pub struct B;
impl T for B {}
pub struct C;
impl T for C {} // compile error ```
This is the list of arguments that can be used in a #[sealed]
attribute:
#[sealed(erase)]
: turns on trait bounds erasure. This is useful when using the #[sealed]
macro inside a function. For an example, see bound-erasure-fn
example.
#[sealed(pub(crate))]
or #[sealed(pub(in some::path))]
: allows to tune visibility of the generated sealing module (the default one is private). This useful when the trait and its impls are defined in different modules. For an example, see nesting
example. Notice, that just pub
is disallowed as breaks the whole idea of sealing.
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
```rust use sealed::sealed;
pub struct A; pub struct B(i32);
pub trait T {}
impl T for A {}
impl T for B {} ```
```rust use sealed::sealed;
pub struct A; pub struct B(i32);
mod _sealt { pub trait Sealed {} } pub trait T: _sealt::Sealed {}
impl _sealt::Sealed for A {} impl T for A {}
impl _sealt::Sealed for B {} impl T for B {} ```