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
use vnode::VNode; #[cfg(target_arch = "wasm32")] use stdweb::web::{Element, Node}; #[cfg(target_arch = "wasm32")] use events::RenderRequestSender; use std::any::Any; #[cfg(target_arch = "wasm32")] pub trait DOMRender { fn dom_render(&mut self, parent: &Element, next: Option<&Node>, render_req: RenderRequestSender); } #[cfg(not(target_arch = "wasm32"))] pub trait ServerRender { fn server_render(&mut self); } #[cfg(not(target_arch = "wasm32"))] pub trait RenderToString { fn render_to_string(&mut self) -> String; } pub trait Component: Lifecycle { type Props: PartialEq; fn create(props: Self::Props, notifier: Box<Fn()>) -> Self; fn update(&mut self, props: Self::Props); fn eq_props(&self, rhs: &Self::Props) -> bool; } pub trait Lifecycle: Render + AsAny { fn created(&mut self) {} fn mounted(&mut self) {} fn updated(&mut self) {} fn destroyed(&mut self) {} } pub trait Render { fn render(&self) -> VNode; } pub trait AsAny { fn as_any(&mut self) -> &mut Any; } pub trait ComponentOf { type Comp: Component; } impl<T: Lifecycle + 'static> AsAny for T { fn as_any(&mut self) -> &mut Any { self } } #[cfg(not(target_arch = "wasm32"))] impl<T: ServerRender + ToString> RenderToString for T { fn render_to_string(&mut self) -> String { self.server_render(); self.to_string() } }