respo/node/component/
effect.rs1mod base;
2
3use std::{any::Any, fmt::Debug, rc::Rc};
4
5use base::RespoEffectDynEq;
6use cirru_parser::Cirru;
7use web_sys::Node;
8
9pub trait RespoEffect
13where
14 Self: Debug + Any + RespoEffectDynEq + 'static,
15{
16 #[allow(unused_variables)]
18 fn run(&self, effect_type: RespoEffectType, el: &Node) -> Result<(), String> {
19 match effect_type {
20 RespoEffectType::Mounted => self.mounted(el),
21 RespoEffectType::BeforeUpdate => self.before_update(el),
22 RespoEffectType::Updated => self.updated(el),
23 RespoEffectType::BeforeUnmount => self.before_unmount(el),
24 }
25 }
26 #[allow(unused_variables)]
28 fn mounted(&self, el: &Node) -> Result<(), String> {
29 Ok(())
30 }
31 #[allow(unused_variables)]
33 fn before_update(&self, el: &Node) -> Result<(), String> {
34 Ok(())
35 }
36 #[allow(unused_variables)]
38 fn updated(&self, el: &Node) -> Result<(), String> {
39 Ok(())
40 }
41 #[allow(unused_variables)]
43 fn before_unmount(&self, el: &Node) -> Result<(), String> {
44 Ok(())
45 }
46}
47
48#[derive(Debug, Clone)]
50pub struct RespoEffectBox(pub Rc<dyn RespoEffect>);
51
52impl PartialEq for RespoEffectBox {
53 fn eq(&self, other: &Self) -> bool {
54 let r = self.0.as_ref();
55 r.do_eq(other.0.as_ref() as &dyn RespoEffectDynEq) == Some(true)
56 }
57}
58impl Eq for RespoEffectBox {}
59
60impl RespoEffectBox {
61 pub fn new<T>(v: T) -> Self
62 where
63 T: RespoEffect + 'static,
64 {
65 Self(Rc::new(v))
66 }
67}
68
69#[derive(Debug, Clone, Copy, PartialEq, Eq)]
74pub enum RespoEffectType {
75 Mounted,
77 BeforeUpdate,
79 Updated,
81 BeforeUnmount,
83}
84
85impl From<RespoEffectType> for Cirru {
86 fn from(effect_type: RespoEffectType) -> Self {
87 match effect_type {
88 RespoEffectType::Mounted => "::mounted".into(),
89 RespoEffectType::BeforeUpdate => "::before-update".into(),
90 RespoEffectType::Updated => "::updated".into(),
91 RespoEffectType::BeforeUnmount => "::before-unmount".into(),
92 }
93 }
94}