wsdom_core/js/immediates/
nullable.rs

1use crate::{
2    js::nullable::{JsNullable, JsNullish},
3    js_cast::JsCast,
4    serialize::{RawCodeImmediate, ToJs, UseInJsCode},
5};
6
7pub struct NullImmediate;
8
9impl UseInJsCode for NullImmediate {
10    fn serialize_to(&self, buf: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
11        RawCodeImmediate("null").serialize_to(buf)
12    }
13}
14
15impl ToJs<JsNullish> for NullImmediate {}
16impl<T> ToJs<JsNullable<T>> for NullImmediate {}
17
18pub struct UndefinedImmediate;
19impl UseInJsCode for UndefinedImmediate {
20    fn serialize_to(&self, buf: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
21        RawCodeImmediate("undefined").serialize_to(buf)
22    }
23}
24
25impl ToJs<JsNullish> for UndefinedImmediate {}
26impl<T> ToJs<JsNullable<T>> for UndefinedImmediate {}
27
28/// The return value implements `ToJs<JsNullish>` and `ToJs<JsNullable<T>>`.
29pub const fn null() -> NullImmediate {
30    NullImmediate
31}
32
33/// The return value implements `ToJs<JsNullish>` and `ToJs<JsNullable<T>>`.
34pub const fn undefined() -> UndefinedImmediate {
35    UndefinedImmediate
36}
37
38impl<'a, T: UseInJsCode> UseInJsCode for Option<&'a T> {
39    fn serialize_to(&self, buf: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
40        match self {
41            Some(t) => t.serialize_to(buf),
42            None => NullImmediate.serialize_to(buf),
43        }
44    }
45}
46
47impl<'a, T, U> ToJs<JsNullable<T>> for Option<&'a U>
48where
49    T: JsCast,
50    U: UseInJsCode + ToJs<T>,
51{
52}