orbital_base_components/overlay/
open_bind.rs1use leptos::prelude::*;
2
3#[derive(Clone, Copy)]
5pub enum OpenBind {
6 Signal(RwSignal<bool>),
7 ReadWrite(ReadSignal<bool>, WriteSignal<bool>),
8}
9
10impl OpenBind {
11 pub fn get(&self) -> bool {
12 match self {
13 Self::Signal(signal) => signal.get(),
14 Self::ReadWrite(read, _) => read.get(),
15 }
16 }
17
18 pub fn get_untracked(&self) -> bool {
19 match self {
20 Self::Signal(signal) => signal.get_untracked(),
21 Self::ReadWrite(read, _) => read.get_untracked(),
22 }
23 }
24
25 pub fn set(&self, value: bool) {
26 match self {
27 Self::Signal(signal) => signal.set(value),
28 Self::ReadWrite(_, write) => write.set(value),
29 }
30 }
31
32 pub fn signal(&self) -> Signal<bool> {
33 match self {
34 Self::Signal(signal) => signal.read_only().into(),
35 Self::ReadWrite(read, _) => {
36 let read = *read;
37 Signal::derive(move || read.get())
38 }
39 }
40 }
41}
42
43impl From<RwSignal<bool>> for OpenBind {
44 fn from(signal: RwSignal<bool>) -> Self {
45 Self::Signal(signal)
46 }
47}
48
49impl From<(ReadSignal<bool>, WriteSignal<bool>)> for OpenBind {
50 fn from((read, write): (ReadSignal<bool>, WriteSignal<bool>)) -> Self {
51 Self::ReadWrite(read, write)
52 }
53}
54
55impl From<bool> for OpenBind {
56 fn from(value: bool) -> Self {
57 Self::Signal(RwSignal::new(value))
58 }
59}
60
61impl Default for OpenBind {
62 fn default() -> Self {
63 Self::Signal(RwSignal::new(false))
64 }
65}
66
67#[cfg(test)]
68mod tests {
69 use super::*;
70
71 #[test]
72 fn rw_signal_round_trip() {
73 Owner::new().with(|| {
74 let signal = RwSignal::new(false);
75 let bind = OpenBind::from(signal);
76 bind.set(true);
77 assert!(bind.get_untracked());
78 bind.set(false);
79 assert!(!bind.get_untracked());
80 });
81 }
82}