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}