use std::borrow::Cow;
use crate::messages::Timestamp;
use super::{
CompressedImage, Endian, Image, RawImage, RawImageEncoding, UnknownCompressionError,
UnknownEncodingError,
};
#[derive(Debug, Clone)]
pub struct ImageMessage<'a> {
pub timestamp: Option<Timestamp>,
pub frame_id: String,
pub image: Image<'a>,
}
impl TryFrom<crate::messages::CompressedImage> for ImageMessage<'static> {
type Error = UnknownCompressionError;
fn try_from(image: crate::messages::CompressedImage) -> std::result::Result<Self, Self::Error> {
Ok(ImageMessage {
timestamp: image.timestamp,
frame_id: image.frame_id,
image: Image::Compressed(CompressedImage {
compression: image.format.parse()?,
data: Cow::Owned(image.data.into()),
}),
})
}
}
impl TryFrom<crate::messages::RawImage> for ImageMessage<'static> {
type Error = UnknownEncodingError;
fn try_from(image: crate::messages::RawImage) -> std::result::Result<Self, Self::Error> {
let encoding = RawImageEncoding::parse_endian(&image.encoding, Endian::Little)?;
Ok(Self {
timestamp: image.timestamp,
frame_id: image.frame_id,
image: Image::Raw(RawImage {
encoding,
width: image.width,
height: image.height,
stride: image.step,
data: Cow::Owned(image.data.into()),
}),
})
}
}
impl ImageMessage<'_> {
pub fn into_owned(self) -> ImageMessage<'static> {
ImageMessage {
timestamp: self.timestamp,
frame_id: self.frame_id,
image: self.image.into_owned(),
}
}
}