use crate::{class::JsClass, value::Constructor, Ctx, Object, Result};
use core::marker::PhantomData;
pub trait MethodImplementor<T>: Sized {
fn implement<'js>(&self, _proto: &Object<'js>) -> Result<()> {
Ok(())
}
}
pub trait ConstructorCreator<'js, T>: Sized {
fn create_constructor(&self, _ctx: &Ctx<'js>) -> Result<Option<Constructor<'js>>> {
Ok(None)
}
}
#[derive(Default)]
pub struct MethodImpl<T>(PhantomData<T>);
impl<T> MethodImpl<T> {
pub fn new() -> Self {
MethodImpl(PhantomData)
}
}
#[derive(Default)]
pub struct ConstructorCreate<T>(PhantomData<T>);
impl<T> ConstructorCreate<T> {
pub fn new() -> Self {
ConstructorCreate(PhantomData)
}
}
impl<T> MethodImplementor<T> for &MethodImpl<T> {}
impl<'js, T> ConstructorCreator<'js, T> for &ConstructorCreate<T> {}
pub struct CloneWrapper<'a, T>(pub &'a T);
pub trait CloneTrait<T> {
fn wrap_clone(&self) -> T;
}
impl<'a, T: Clone> CloneTrait<T> for CloneWrapper<'a, T> {
fn wrap_clone(&self) -> T {
self.0.clone()
}
}
#[derive(Default)]
pub struct JsClassFieldCheck<T>(PhantomData<T>);
impl<T> JsClassFieldCheck<T> {
pub fn new() -> Self {
Self(PhantomData)
}
}
#[diagnostic::on_unimplemented(
message = "using a `JsClass` type directly as a class field is not supported",
label = "`{Self}` implements `JsClass` \u{2014} wrap the field in `Class<'js, T>` instead",
note = "nested mutations are lost because the generated getter clones the value"
)]
pub trait NotAJsClassField {}
impl<'js, T: JsClass<'js>> JsClassFieldCheck<T> {
pub fn check(self)
where
T: NotAJsClassField,
{
}
}
pub trait JsClassFieldCheckFallback {
fn check(self);
}
impl<T> JsClassFieldCheckFallback for &JsClassFieldCheck<T> {
fn check(self) {}
}