summaryrefslogtreecommitdiff
path: root/crates/renderer/src/toggle.rs
blob: 7add3ca78eded79a33d97296563a7d2e55e6b168 (plain)
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
use teleia::*;
use std::collections::HashMap;

#[derive(Debug, Clone)]
pub struct Toggle {
    pub val: bool,
    pub set_time: u64,
}

pub struct Toggles {
    toggles: HashMap<String, Toggle>,
}
impl Toggles {
    pub fn new() -> Self {
        Self {
            toggles: HashMap::new(),
        }
    }
    pub fn set(&mut self, ctx: &context::Context, st: &state::State, nm: &str, val: bool) {
        self.toggles.insert(nm.to_string(), Toggle { val, set_time: st.tick });
    }
    pub fn get(&self, ctx: &context::Context, st: &state::State, nm: &str) -> Option<Toggle> {
        self.toggles.get(nm).cloned()
    }
    pub fn reset(&mut self) {
        self.toggles.clear();
    }
    pub fn handle(&mut self,
        ctx: &context::Context, st: &state::State,
        msg: net::fig::BinaryMessage
    ) {
        let nm = if let Ok(s) = str::from_utf8(&msg.data) { s } else {
            log::warn!("failed to decode toggle name");
            return;
        };
        let prev = self.get(ctx, st, nm).map(|t| t.val).unwrap_or(false);
        self.set(ctx, st, nm, !prev);
    }
    pub fn handle_set(&mut self,
        ctx: &context::Context, st: &state::State,
        msg: net::fig::BinaryMessage, val: bool
    ) {
        let nm = if let Ok(s) = str::from_utf8(&msg.data) { s } else {
            log::warn!("failed to decode toggle name");
            return;
        };
        self.set(ctx, st, nm, val);
    }
}