use ros_message::Time

This commit is contained in:
Alex Mikhalev 2021-11-19 21:30:28 -08:00
parent e70f7b41dd
commit 32e4bee157
8 changed files with 90 additions and 30 deletions

View File

@ -21,6 +21,8 @@ regex = "1.5.4"
ros_message = "0.1.0"
smallvec = "1.6.1"
thiserror = "1.0.28"
smol_str = { version = "0.1.17", default-features = false }
indexmap = "1.7.0"
[dev-dependencies]
color-eyre = "0.5.11"

View File

@ -4,9 +4,10 @@ use eyre::bail;
use crate::{
error,
parse::{Header, Op, Time},
parse::{Header, Op},
reader::BagReader,
Error, Result,
Time
};
#[derive(Clone, Copy, Debug)]

View File

@ -6,9 +6,9 @@ use nom::{number::streaming::le_u32, sequence::tuple, Parser};
use crate::{
error,
parse::{self, Header, Op, Time},
parse::{self, header::fields::parse_time, Header, Op},
reader::BagReader,
Result,
Result, Time,
};
#[derive(Debug)]
@ -188,7 +188,7 @@ pub struct IndexEntry {
impl IndexEntry {
pub fn parse(input: parse::Input) -> parse::IResult<Self> {
tuple((Time::parse, le_u32))
tuple((parse_time, le_u32))
.map(|(time, offset)| IndexEntry { time, offset })
.parse(input)
}

View File

@ -0,0 +1,58 @@
use ros_message::I8Variant;
use crate::SmallStr;
#[derive(Clone, Debug)]
pub enum FieldType {
/// Represents `bool`.
Bool,
/// Represents `int8` or `byte`.
I8(I8Variant),
/// Represents `int16`.
I16,
/// Represents `int32`.
I32,
/// Represents `int64`.
I64,
/// Represents `uint8` or `char`.
U8(I8Variant),
/// Represents `uint16`.
U16,
/// Represents `uint32`.
U32,
/// Represents `uint64`.
U64,
/// Represents `float32`.
F32,
/// Represents `float64`.
F64,
/// Represents `string`.
String,
/// Represents `time`.
Time,
/// Represents `duration`.
Duration,
// Another messgage type.
Message(MessageLayoutRef),
}
#[derive(Clone, Debug)]
pub struct FieldLayout {
pub typ: FieldType,
pub name: SmallStr,
pub multiplicity: Multiplicity,
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub enum Multiplicity {
Unit,
Fixed(usize),
Dynamic,
}
#[derive(Clone, Debug)]
pub struct MessageLayout {
fields: Vec<FieldLayout>,
}
pub type MessageLayoutRef = std::sync::Arc<MessageLayout>;

View File

@ -2,10 +2,16 @@ pub mod bag;
pub mod chunk;
mod error;
pub mod index;
pub mod info;
pub mod layout;
pub mod message;
pub mod parse;
pub mod reader;
pub mod info;
pub use error::{Error, Result};
pub use ros_message::Time;
use smol_str::SmolStr;
pub use bag::Bag;
pub use error::{Error, Result};
pub type SmallStr = SmolStr;

View File

@ -3,7 +3,7 @@ pub mod header;
mod version;
pub use error::{Error, ErrorKind};
pub use header::{Header, Op, Time};
pub use header::{Header, Op};
pub use version::Version;
pub type Input<'a> = &'a [u8];

View File

@ -12,14 +12,14 @@ use nom::{
use smallvec::SmallVec;
use super::{IResult, Input};
use crate::Result;
use crate::{Result, Time};
mod error;
mod fields;
pub mod fields;
pub use self::{
error::{FieldDataError, MissingFieldError},
fields::{Op, Time},
fields::Op,
};
#[derive(Clone, Debug)]
@ -95,7 +95,7 @@ impl Header {
}
pub fn read_time(&self, field: &[u8]) -> Result<Time> {
self.read_u64(field).map(Time::from_packed)
self.find_field(field).and_then(fields::read_time)
}
pub fn read_u32(&self, field: &[u8]) -> Result<u32> {

View File

@ -4,6 +4,7 @@ use nom::{
Parser,
};
use num_enum::TryFromPrimitive;
use ros_message::Time;
use crate::parse::IResult;
@ -29,28 +30,20 @@ impl Op {
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord)]
pub struct Time {
pub sec: u32,
pub nsec: u32,
fn time_from_packed(packed: u64) -> Time {
Time {
sec: packed as u32,
nsec: (packed >> 32) as u32,
}
}
impl Time {
pub fn from_packed(packed: u64) -> Time {
Time {
sec: packed as u32,
nsec: (packed >> 32) as u32,
}
}
pub fn parse_time(input: Input) -> IResult<Time> {
le_u64.map(time_from_packed).parse(input)
}
pub fn parse(input: Input) -> IResult<Self> {
le_u64.map(Time::from_packed).parse(input)
}
pub fn read(input: Input) -> Result<Self> {
let (_, x) = Self::parse(input).map_err(FieldDataError::from)?;
Ok(x)
}
pub fn read_time(input: Input) -> Result<Time> {
let (_, x) = parse_time(input).map_err(FieldDataError::from)?;
Ok(x)
}
pub fn read_u32(input: Input) -> Result<u32> {