wsdom-core 0.0.1

for the wsdom crate
Documentation
macro_rules! impl_basic {
    ($name:ident; $($generic:ident)?; $derefsto:ident) => {
        #[derive(Clone, ::ref_cast::RefCast)]
        #[repr(transparent)]
        pub struct $name $(<$generic>)? (JsValue, ::core::marker::PhantomData <($($generic,)?)> );

        impl $(<$generic>)? std::ops::Deref for $name $(<$generic>)? {
            type Target = JsValue;
            fn deref(&self) -> &JsValue {
                self.as_ref()
            }
        }

        impl_basic!(@one_conversion; $name; $($generic)?; $derefsto);

        impl $(<$generic>)? JsCast for $name $(<$generic>)? {
            fn unchecked_from_js(val: JsValue) -> Self {
                Self(val, ::core::marker::PhantomData)
            }
            fn unchecked_from_js_ref(val: &JsValue) -> &Self {
                ::ref_cast::RefCast::ref_cast(val)
            }
        }

        impl $(<$generic>)? UseInJsCode for $name $(<$generic>)? {
            fn serialize_to(&self, buf: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
                self.0.serialize_to(buf)
            }
        }

        impl $(<$generic>)? AsRef<Self> for $name $(<$generic>)? {
            fn as_ref(&self) -> & Self {
                self
            }
        }
    };
    ($name:ident) => {
        impl_basic!($name;;JsValue);
    };
    (@one_conversion; $name: ident; $($generic:ident)?; $convertto:ident) => {
        impl $(<$generic>)? Into<$convertto> for $name $(<$generic>)? {
            fn into(self) -> $convertto {
                JsCast::unchecked_from_js(self.0)
            }
        }
        impl $(<$generic>)? AsRef<$convertto> for $name $(<$generic>)? {
            fn as_ref(&self) -> & $convertto {
                JsCast::unchecked_from_js_ref(&self.0)
            }
        }
    }
}