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}