wavefst/block/
blackout.rs1use crate::encoding::{decode_varint, encode_varint};
2use crate::error::{Error, Result};
3
4#[derive(Debug, Clone, Copy, PartialEq, Eq)]
6pub struct BlackoutEvent {
7 pub is_on: bool,
9 pub time: u64,
11}
12
13#[derive(Debug, Clone, Default)]
15pub struct BlackoutBlock {
16 pub events: Vec<BlackoutEvent>,
18}
19
20impl BlackoutBlock {
21 pub fn encode(&self, out: &mut Vec<u8>) {
23 encode_varint(self.events.len() as u64, out);
24 let mut prev = 0u64;
25 for event in &self.events {
26 out.push(if event.is_on { 1 } else { 0 });
27 let delta = event.time.saturating_sub(prev);
28 encode_varint(delta, out);
29 prev = event.time;
30 }
31 }
32
33 pub fn decode(mut data: &[u8]) -> Result<Self> {
35 let count = decode_varint(&mut data)?;
36 let mut events = Vec::with_capacity(count as usize);
37 let mut time = 0u64;
38 for _ in 0..count {
39 let (flag, rest) = data
40 .split_first()
41 .ok_or_else(|| Error::decode("unexpected end of blackout data"))?;
42 data = rest;
43 let delta = decode_varint(&mut data)?;
44 time = time
45 .checked_add(delta)
46 .ok_or_else(|| Error::decode("blackout time overflow"))?;
47 events.push(BlackoutEvent {
48 is_on: *flag != 0,
49 time,
50 });
51 }
52 Ok(Self { events })
53 }
54}