Skip to main content

ferrijs_std/stream_web/utils/
mod.rs

1use crate::utils::option::Undefined;
2use rquickjs::{
3    class::{JsClass, OwnedBorrowMut},
4    Class, Ctx, FromJs, IntoAtom, Object, Result, Value,
5};
6
7pub mod promise;
8pub mod queue;
9
10// the trait used elsewhere in this repo accepts null values as 'None', which causes many web platform tests to fail as they
11// like to check that undefined is accepted and null isn't.
12pub trait ValueOrUndefined<'js> {
13    fn get_value_or_undefined<K: IntoAtom<'js> + Clone, V: FromJs<'js>>(
14        &self,
15        k: K,
16    ) -> Result<Option<V>>;
17}
18
19impl<'js> ValueOrUndefined<'js> for Object<'js> {
20    fn get_value_or_undefined<K: IntoAtom<'js> + Clone, V: FromJs<'js> + Sized>(
21        &self,
22        k: K,
23    ) -> Result<Option<V>> {
24        let value = self.get::<K, Value<'js>>(k)?;
25        Ok(Undefined::from_js(self.ctx(), value)?.0)
26    }
27}
28
29impl<'js> ValueOrUndefined<'js> for Value<'js> {
30    fn get_value_or_undefined<K: IntoAtom<'js> + Clone, V: FromJs<'js>>(
31        &self,
32        k: K,
33    ) -> Result<Option<V>> {
34        if let Some(obj) = self.as_object() {
35            return obj.get_value_or_undefined(k);
36        }
37        Ok(None)
38    }
39}
40
41pub trait UnwrapOrUndefined<'js> {
42    fn unwrap_or_undefined(self, ctx: &Ctx<'js>) -> Value<'js>;
43}
44
45impl<'js> UnwrapOrUndefined<'js> for Option<Value<'js>> {
46    fn unwrap_or_undefined(self, ctx: &Ctx<'js>) -> Value<'js> {
47        self.unwrap_or_else(|| Value::new_undefined(ctx.clone()))
48    }
49}
50
51pub fn class_from_owned_borrow_mut<'js, T: JsClass<'js>>(
52    borrow: OwnedBorrowMut<'js, T>,
53) -> (Class<'js, T>, OwnedBorrowMut<'js, T>) {
54    let class = borrow.into_inner();
55    let borrow = OwnedBorrowMut::from_class(class.clone());
56    (class, borrow)
57}