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