simdata: refactor RmpData trait to accept generic RmpRead/Write traits
This commit is contained in:
@@ -1,7 +1,7 @@
|
|||||||
use rmp::{Marker, decode::{ExtMeta, RmpRead, ValueReadError}, encode::{RmpWrite, ValueWriteError}};
|
use rmp::{decode::{ExtMeta, RmpRead, RmpReadErr, ValueReadError}, encode::{RmpWrite, RmpWriteErr, ValueWriteError}};
|
||||||
|
|
||||||
pub trait RmpData: Sized {
|
pub trait RmpData: Sized {
|
||||||
fn from_rmp<Reader: RmpRead>(reader: &mut Reader) -> Result<Self, SimDataError<ValueReadError<Reader::Error>>>;
|
fn from_rmp<Reader: RmpRead<Error = E>, E: RmpReadErr + RmpWriteErr>(reader: &mut Reader) -> Result<Self, SimDataError<E>>;
|
||||||
fn write_rmp<Writer: RmpWrite>(&self, writer: &mut Writer) -> Result<(), ValueWriteError<Writer::Error>>;
|
fn write_rmp<Writer: RmpWrite>(&self, writer: &mut Writer) -> Result<(), ValueWriteError<Writer::Error>>;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -11,12 +11,13 @@ pub trait EventRecord: RmpData {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub enum SimDataError<E> {
|
pub enum SimDataError<E: RmpReadErr + RmpWriteErr> {
|
||||||
StreamIndexMissing,
|
StreamIndexMissing,
|
||||||
InvalidChunkSize { expected: usize, found: usize },
|
InvalidChunkSize { expected: usize, found: usize },
|
||||||
MissingTimecode,
|
MissingTimecode,
|
||||||
BadString,
|
BadString,
|
||||||
DecodeError(E),
|
DecodeError(ValueReadError<E>),
|
||||||
|
EncodeError(ValueWriteError<E>),
|
||||||
EndOfStream,
|
EndOfStream,
|
||||||
UnsupportedStreamType(ExtMeta),
|
UnsupportedStreamType(ExtMeta),
|
||||||
EventHeaderMissing,
|
EventHeaderMissing,
|
||||||
@@ -24,12 +25,18 @@ pub enum SimDataError<E> {
|
|||||||
NotEnoughSpace
|
NotEnoughSpace
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<E> From<E> for SimDataError<E> {
|
impl<E: RmpReadErr + RmpWriteErr> From<ValueReadError<E>> for SimDataError<E> {
|
||||||
fn from(value: E) -> Self {
|
fn from(value: ValueReadError<E>) -> Self {
|
||||||
SimDataError::DecodeError(value)
|
SimDataError::DecodeError(value)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl<E: RmpReadErr + RmpWriteErr> From<ValueWriteError<E>> for SimDataError<E> {
|
||||||
|
fn from(value: ValueWriteError<E>) -> Self {
|
||||||
|
SimDataError::EncodeError(value)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
||||||
pub enum StreamType {
|
pub enum StreamType {
|
||||||
IMU,
|
IMU,
|
||||||
@@ -69,11 +76,11 @@ pub struct StreamIndex {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl RmpData for StreamIndex {
|
impl RmpData for StreamIndex {
|
||||||
fn from_rmp<Reader: RmpRead>(reader: &mut Reader) -> Result<Self, SimDataError<ValueReadError<Reader::Error>>> {
|
fn from_rmp<Reader: RmpRead<Error = E>, E: RmpReadErr + RmpWriteErr>(reader: &mut Reader) -> Result<Self, SimDataError<E>> {
|
||||||
if rmp::decode::read_u16(reader)? != 0xDA1A {
|
if rmp::decode::read_u16(reader)? != 0xDA1A {
|
||||||
Err(SimDataError::StreamIndexMissing)
|
Err(SimDataError::StreamIndexMissing)
|
||||||
} else {
|
} else {
|
||||||
rmp::decode::read_array_len(reader).map(|count| {
|
rmp::decode::read_u64(reader).map(|count| {
|
||||||
Self {
|
Self {
|
||||||
count: count as usize
|
count: count as usize
|
||||||
}
|
}
|
||||||
@@ -83,7 +90,7 @@ impl RmpData for StreamIndex {
|
|||||||
|
|
||||||
fn write_rmp<Writer: RmpWrite>(&self, writer: &mut Writer) -> Result<(), ValueWriteError<Writer::Error>> {
|
fn write_rmp<Writer: RmpWrite>(&self, writer: &mut Writer) -> Result<(), ValueWriteError<Writer::Error>> {
|
||||||
rmp::encode::write_u16(writer, 0xDA1A)?;
|
rmp::encode::write_u16(writer, 0xDA1A)?;
|
||||||
rmp::encode::write_array_len(writer, self.count as u32)?;
|
rmp::encode::write_u64(writer, self.count as u64)?;
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -96,7 +103,7 @@ pub struct BundleEventHeader {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl RmpData for BundleEventHeader {
|
impl RmpData for BundleEventHeader {
|
||||||
fn from_rmp<Reader: RmpRead>(reader: &mut Reader) -> Result<Self, SimDataError<ValueReadError<Reader::Error>>> {
|
fn from_rmp<Reader: RmpRead<Error = E>, E: RmpReadErr + RmpWriteErr>(reader: &mut Reader) -> Result<Self, SimDataError<E>> {
|
||||||
let meta = rmp::decode::read_i8(reader)?;
|
let meta = rmp::decode::read_i8(reader)?;
|
||||||
if let Ok(id) = meta.try_into() {
|
if let Ok(id) = meta.try_into() {
|
||||||
Ok(Self {
|
Ok(Self {
|
||||||
@@ -119,7 +126,7 @@ pub struct StreamHeader {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl RmpData for StreamHeader {
|
impl RmpData for StreamHeader {
|
||||||
fn from_rmp<Reader: RmpRead>(reader: &mut Reader) -> Result<Self, SimDataError<ValueReadError<Reader::Error>>> {
|
fn from_rmp<Reader: RmpRead<Error = E>, E: RmpReadErr + RmpWriteErr>(reader: &mut Reader) -> Result<Self, SimDataError<E>> {
|
||||||
let meta = rmp::decode::read_ext_meta(reader)?;
|
let meta = rmp::decode::read_ext_meta(reader)?;
|
||||||
if let Ok(id) = meta.typeid.try_into() {
|
if let Ok(id) = meta.typeid.try_into() {
|
||||||
Ok(Self {
|
Ok(Self {
|
||||||
@@ -143,14 +150,14 @@ pub struct EventStreamHeader {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl RmpData for EventStreamHeader {
|
impl RmpData for EventStreamHeader {
|
||||||
fn from_rmp<Reader: RmpRead>(reader: &mut Reader) -> Result<Self, SimDataError<ValueReadError<Reader::Error>>> {
|
fn from_rmp<Reader: RmpRead<Error = E>, E: RmpReadErr + RmpWriteErr>(reader: &mut Reader) -> Result<Self, SimDataError<E>> {
|
||||||
Ok(Self {
|
Ok(Self {
|
||||||
count: rmp::decode::read_array_len(reader)? as usize
|
count: rmp::decode::read_u32(reader)? as usize
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
fn write_rmp<Writer: RmpWrite>(&self, writer: &mut Writer) -> Result<(), ValueWriteError<Writer::Error>> {
|
fn write_rmp<Writer: RmpWrite>(&self, writer: &mut Writer) -> Result<(), ValueWriteError<Writer::Error>> {
|
||||||
rmp::encode::write_array_len(writer, self.count as u32)?;
|
rmp::encode::write_u32(writer, self.count as u32)?;
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -162,7 +169,7 @@ pub struct StreamEvent<Event: EventRecord> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl<Event: EventRecord> RmpData for StreamEvent<Event> {
|
impl<Event: EventRecord> RmpData for StreamEvent<Event> {
|
||||||
fn from_rmp<Reader: RmpRead>(reader: &mut Reader) -> Result<Self, SimDataError<ValueReadError<Reader::Error>>> {
|
fn from_rmp<Reader: RmpRead<Error = E>, E: RmpReadErr + RmpWriteErr>(reader: &mut Reader) -> Result<Self, SimDataError<E>> {
|
||||||
let chunk_len = rmp::decode::read_array_len(reader).map_err(|_| { SimDataError::EventHeaderMissing })? as usize;
|
let chunk_len = rmp::decode::read_array_len(reader).map_err(|_| { SimDataError::EventHeaderMissing })? as usize;
|
||||||
// Add 1 to the field count for the timestamp
|
// Add 1 to the field count for the timestamp
|
||||||
if chunk_len != Event::field_count() + 1 {
|
if chunk_len != Event::field_count() + 1 {
|
||||||
@@ -210,7 +217,7 @@ impl EventRecord for IMUReading {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl RmpData for GPSReading {
|
impl RmpData for GPSReading {
|
||||||
fn from_rmp<Reader: RmpRead>(reader: &mut Reader) -> Result<Self, SimDataError<ValueReadError<Reader::Error>>> {
|
fn from_rmp<Reader: RmpRead<Error = E>, E: RmpReadErr + RmpWriteErr>(reader: &mut Reader) -> Result<Self, SimDataError<E>> {
|
||||||
Ok(Self {
|
Ok(Self {
|
||||||
lat: rmp::decode::read_f64(reader)?,
|
lat: rmp::decode::read_f64(reader)?,
|
||||||
lon: rmp::decode::read_f64(reader)?
|
lon: rmp::decode::read_f64(reader)?
|
||||||
@@ -234,7 +241,7 @@ pub struct IMUReading {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl RmpData for IMUReading {
|
impl RmpData for IMUReading {
|
||||||
fn from_rmp<Reader: RmpRead>(reader: &mut Reader) -> Result<Self, SimDataError<ValueReadError<Reader::Error>>> {
|
fn from_rmp<Reader: RmpRead<Error = E>, E: RmpReadErr + RmpWriteErr>(reader: &mut Reader) -> Result<Self, SimDataError<E>> {
|
||||||
Ok(Self {
|
Ok(Self {
|
||||||
accel_x: rmp::decode::read_f64(reader)?,
|
accel_x: rmp::decode::read_f64(reader)?,
|
||||||
accel_y: rmp::decode::read_f64(reader)?,
|
accel_y: rmp::decode::read_f64(reader)?,
|
||||||
@@ -264,7 +271,7 @@ pub struct AnnotationReading {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl RmpData for AnnotationReading {
|
impl RmpData for AnnotationReading {
|
||||||
fn from_rmp<Reader: RmpRead>(reader: &mut Reader) -> Result<Self, SimDataError<ValueReadError<Reader::Error>>> {
|
fn from_rmp<Reader: RmpRead<Error = E>, E: RmpReadErr + RmpWriteErr>(reader: &mut Reader) -> Result<Self, SimDataError<E>> {
|
||||||
let mut buf = [0; 32];
|
let mut buf = [0; 32];
|
||||||
rmp::decode::read_str(reader, &mut buf).map_err(|_| { SimDataError::BadString })?;
|
rmp::decode::read_str(reader, &mut buf).map_err(|_| { SimDataError::BadString })?;
|
||||||
Ok(Self {
|
Ok(Self {
|
||||||
|
|||||||
Reference in New Issue
Block a user