material_yew/list/
selected_detail.rs1use crate::list::ListIndex;
2use js_sys::Object;
3use wasm_bindgen::prelude::*;
4use wasm_bindgen::JsCast;
5
6#[derive(Debug)]
10pub struct SelectedDetail {
11 pub index: ListIndex,
12 pub diff: Option<IndexDiff>,
13}
14
15#[derive(Debug)]
19pub struct IndexDiff {
20 pub added: Vec<usize>,
21 pub removed: Vec<usize>,
22}
23
24impl From<JsValue> for SelectedDetail {
25 fn from(value: JsValue) -> Self {
26 let detail = value.unchecked_into::<SelectedDetailJS>();
27 let index = ListIndex::from(detail.index());
28
29 let diff = if detail.diff().is_undefined() {
30 None
31 } else {
32 let diff = detail.diff();
33 Some(IndexDiff {
34 added: diff.added(),
35 removed: diff.removed(),
36 })
37 };
38 Self { index, diff }
39 }
40}
41
42#[wasm_bindgen]
43extern "C" {
44 #[derive(Debug)]
45 #[wasm_bindgen(extends = Object)]
46 type SelectedDetailJS;
47
48 #[wasm_bindgen(method, getter)]
49 pub fn index(this: &SelectedDetailJS) -> JsValue;
50
51 #[wasm_bindgen(method, getter)]
52 pub fn diff(this: &SelectedDetailJS) -> IndexDiffJS;
53
54 #[derive(Debug)]
55 #[wasm_bindgen(extends = Object)]
56 type IndexDiffJS;
57
58 #[wasm_bindgen(method, getter)]
59 pub fn added(this: &IndexDiffJS) -> Vec<usize>;
60
61 #[wasm_bindgen(method, getter)]
62 pub fn removed(this: &IndexDiffJS) -> Vec<usize>;
63}