ferrijs_std/stream_web/utils/
mod.rs1use 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
10pub 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}