espers/records/
acti.rs

1use super::{get_cursor, Flags};
2use crate::error::Error;
3use crate::fields::EDID;
4use binrw::binrw;
5use binrw::BinRead;
6use serde_derive::{Deserialize, Serialize};
7use std::fmt;
8use std::io::Cursor;
9
10#[binrw]
11#[derive(Debug, Clone, Serialize, Deserialize)]
12#[brw(little, magic = b"ACTI")]
13pub struct ACTI {
14    pub size: u32,
15    pub flags: Flags,
16    pub form_id: u32,
17    pub timestamp: u16,
18    pub version_control: u16,
19    pub internal_version: u16,
20    pub unknown: u16,
21    #[br(count = size)]
22    pub data: Vec<u8>,
23}
24
25#[derive(Debug, Clone, Serialize, Deserialize)]
26pub struct Activator {
27    pub edid: String,
28}
29
30impl fmt::Display for Activator {
31    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
32        write!(f, "Activator ({})", self.edid)
33    }
34}
35
36impl TryFrom<ACTI> for Activator {
37    type Error = Error;
38
39    fn try_from(raw: ACTI) -> Result<Self, Self::Error> {
40        let data = get_cursor(&raw.data, raw.flags.contains(Flags::COMPRESSED));
41        let mut cursor = Cursor::new(&data);
42
43        let edid = EDID::read(&mut cursor)?.try_into()?;
44
45        Ok(Self { edid })
46    }
47}