use crate::errors::{ErrorKind, Result};
use crate::one::property::PropertyType;
use crate::onestore::object::Object;
#[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug)]
pub enum ColorRef {
Auto,
Manual {
r: u8,
g: u8,
b: u8,
},
}
impl ColorRef {
pub(crate) fn parse(prop_type: PropertyType, object: &Object) -> Result<Option<ColorRef>> {
let value = match object.props().get(prop_type) {
Some(value) => value.to_u32().ok_or_else(|| {
ErrorKind::MalformedOneNoteFileData("color ref is not a u32".into())
})?,
None => return Ok(None),
};
let bytes = value.to_le_bytes();
let color = match bytes[3] {
0xFF => ColorRef::Auto,
0x00 => ColorRef::Manual {
r: bytes[0],
g: bytes[1],
b: bytes[2],
},
_ => {
return Err(ErrorKind::MalformedOneNoteFileData(
format!("invalid color ref: 0x{:08X}", value).into(),
)
.into())
}
};
Ok(Some(color))
}
}