1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
#![no_std] use js::*; extern crate alloc; pub trait GetProperty { fn get_property(el: impl Into<f64>, name: &str) -> Option<Self> where Self: Sized; } impl GetProperty for f64 { fn get_property(el: impl Into<f64>, name: &str) -> Option<Self> { Some( js!("function(el,strPtr,strLen){ el = this.getObject(el); return el[this.readUtf8FromMemory(strPtr,strLen)]; }") .invoke_3(el.into(), name.as_ptr() as u32, name.len() as u32), ) } } impl GetProperty for alloc::string::String { fn get_property(el: impl Into<f64>, name: &str) -> Option<Self> { let attr = js!(r#"function(o,strPtr,strLen){ o = this.getObject(o); const a = o[this.readUtf8FromMemory(strPtr,strLen)]; if(a === null){ return -1; } return this.writeCStringToMemory(a); }"#) .invoke_3(el.into(), name.as_ptr() as u32, name.len() as u32); if attr == -1.0 { return None; } else { Some(cstr_to_string(attr as i32)) } } } pub fn get_property<T>(el: impl Into<f64>, id: &str) -> Option<T> where T: GetProperty, { T::get_property(el, id) } pub trait SetProperty { fn set_property(el: impl Into<f64>, id: &str, s: Self); } impl SetProperty for f64 { fn set_property(el: impl Into<f64>, id: &str, v: Self) { js!("function(el,strPtr,strLen,value){ el = this.getObject(el); return el[this.readUtf8FromMemory(strPtr,strLen)] = value; }") .invoke_4(el.into(), id.as_ptr() as u32, id.len() as u32, v); } } impl SetProperty for &str { fn set_property(el: impl Into<f64>, name: &str, txt: Self) { js!(r#"function(o,strPtr,strLen,valPtr,valLen){ o = this.getObject(o); o[this.readUtf8FromMemory(strPtr,strLen)] = this.readUtf8FromMemory(valPtr,valLen); }"#) .invoke_5( el.into(), name.as_ptr() as u32, name.len() as u32, txt.as_ptr() as u32, txt.len() as u32, ); } } pub fn set_property<T>(el: impl Into<f64>, id: &str, v: T) where T: SetProperty, { T::set_property(el, id, v) } pub fn get_object(handle: impl Into<f64>) -> JSObject { let r = js!("function(o){ return this.storeObject(this.getObject(o).target); }") .invoke_1(handle.into()); JSObject::from(r) }