facet_core/
opaque.rs

1use crate::{Def, value_vtable};
2use crate::{Facet, Shape, Type, UserType};
3
4/// Helper type for opaque members
5#[repr(transparent)]
6pub struct Opaque<T: ?Sized>(pub T);
7
8unsafe impl<'facet, T: 'facet> Facet<'facet> for Opaque<T> {
9    const SHAPE: &'static Shape = &const {
10        Shape::builder_for_sized::<Self>()
11            .type_identifier("Opaque")
12            .ty(Type::User(UserType::Opaque))
13            .def(Def::Scalar)
14            // Since T is opaque and could be anything, we can't provide much functionality.
15            // Using `()` for the vtable like PhantomData.
16            .vtable(value_vtable!((), |f, _opts| write!(
17                f,
18                "{}",
19                Self::SHAPE.type_identifier
20            )))
21            .build()
22    };
23}