use ros_message::Time
This commit is contained in:
		
							parent
							
								
									e70f7b41dd
								
							
						
					
					
						commit
						32e4bee157
					
				@ -21,6 +21,8 @@ regex = "1.5.4"
 | 
				
			|||||||
ros_message = "0.1.0"
 | 
					ros_message = "0.1.0"
 | 
				
			||||||
smallvec = "1.6.1"
 | 
					smallvec = "1.6.1"
 | 
				
			||||||
thiserror = "1.0.28"
 | 
					thiserror = "1.0.28"
 | 
				
			||||||
 | 
					smol_str = { version = "0.1.17", default-features = false }
 | 
				
			||||||
 | 
					indexmap = "1.7.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[dev-dependencies]
 | 
					[dev-dependencies]
 | 
				
			||||||
color-eyre = "0.5.11"
 | 
					color-eyre = "0.5.11"
 | 
				
			||||||
 | 
				
			|||||||
@ -4,9 +4,10 @@ use eyre::bail;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
use crate::{
 | 
					use crate::{
 | 
				
			||||||
    error,
 | 
					    error,
 | 
				
			||||||
    parse::{Header, Op, Time},
 | 
					    parse::{Header, Op},
 | 
				
			||||||
    reader::BagReader,
 | 
					    reader::BagReader,
 | 
				
			||||||
    Error, Result,
 | 
					    Error, Result,
 | 
				
			||||||
 | 
					    Time
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#[derive(Clone, Copy, Debug)]
 | 
					#[derive(Clone, Copy, Debug)]
 | 
				
			||||||
 | 
				
			|||||||
@ -6,9 +6,9 @@ use nom::{number::streaming::le_u32, sequence::tuple, Parser};
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
use crate::{
 | 
					use crate::{
 | 
				
			||||||
    error,
 | 
					    error,
 | 
				
			||||||
    parse::{self, Header, Op, Time},
 | 
					    parse::{self, header::fields::parse_time, Header, Op},
 | 
				
			||||||
    reader::BagReader,
 | 
					    reader::BagReader,
 | 
				
			||||||
    Result,
 | 
					    Result, Time,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#[derive(Debug)]
 | 
					#[derive(Debug)]
 | 
				
			||||||
@ -188,7 +188,7 @@ pub struct IndexEntry {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
impl IndexEntry {
 | 
					impl IndexEntry {
 | 
				
			||||||
    pub fn parse(input: parse::Input) -> parse::IResult<Self> {
 | 
					    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 })
 | 
					            .map(|(time, offset)| IndexEntry { time, offset })
 | 
				
			||||||
            .parse(input)
 | 
					            .parse(input)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
				
			|||||||
@ -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>;
 | 
				
			||||||
							
								
								
									
										10
									
								
								src/lib.rs
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								src/lib.rs
									
									
									
									
									
								
							@ -2,10 +2,16 @@ pub mod bag;
 | 
				
			|||||||
pub mod chunk;
 | 
					pub mod chunk;
 | 
				
			||||||
mod error;
 | 
					mod error;
 | 
				
			||||||
pub mod index;
 | 
					pub mod index;
 | 
				
			||||||
 | 
					pub mod info;
 | 
				
			||||||
 | 
					pub mod layout;
 | 
				
			||||||
pub mod message;
 | 
					pub mod message;
 | 
				
			||||||
pub mod parse;
 | 
					pub mod parse;
 | 
				
			||||||
pub mod reader;
 | 
					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 bag::Bag;
 | 
				
			||||||
 | 
					pub use error::{Error, Result};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					pub type SmallStr = SmolStr;
 | 
				
			||||||
 | 
				
			|||||||
@ -3,7 +3,7 @@ pub mod header;
 | 
				
			|||||||
mod version;
 | 
					mod version;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
pub use error::{Error, ErrorKind};
 | 
					pub use error::{Error, ErrorKind};
 | 
				
			||||||
pub use header::{Header, Op, Time};
 | 
					pub use header::{Header, Op};
 | 
				
			||||||
pub use version::Version;
 | 
					pub use version::Version;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
pub type Input<'a> = &'a [u8];
 | 
					pub type Input<'a> = &'a [u8];
 | 
				
			||||||
 | 
				
			|||||||
@ -12,14 +12,14 @@ use nom::{
 | 
				
			|||||||
use smallvec::SmallVec;
 | 
					use smallvec::SmallVec;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
use super::{IResult, Input};
 | 
					use super::{IResult, Input};
 | 
				
			||||||
use crate::Result;
 | 
					use crate::{Result, Time};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
mod error;
 | 
					mod error;
 | 
				
			||||||
mod fields;
 | 
					pub mod fields;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
pub use self::{
 | 
					pub use self::{
 | 
				
			||||||
    error::{FieldDataError, MissingFieldError},
 | 
					    error::{FieldDataError, MissingFieldError},
 | 
				
			||||||
    fields::{Op, Time},
 | 
					    fields::Op,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#[derive(Clone, Debug)]
 | 
					#[derive(Clone, Debug)]
 | 
				
			||||||
@ -95,7 +95,7 @@ impl Header {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    pub fn read_time(&self, field: &[u8]) -> Result<Time> {
 | 
					    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> {
 | 
					    pub fn read_u32(&self, field: &[u8]) -> Result<u32> {
 | 
				
			||||||
 | 
				
			|||||||
@ -4,6 +4,7 @@ use nom::{
 | 
				
			|||||||
    Parser,
 | 
					    Parser,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
use num_enum::TryFromPrimitive;
 | 
					use num_enum::TryFromPrimitive;
 | 
				
			||||||
 | 
					use ros_message::Time;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
use crate::parse::IResult;
 | 
					use crate::parse::IResult;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -29,28 +30,20 @@ impl Op {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord)]
 | 
					fn time_from_packed(packed: u64) -> Time {
 | 
				
			||||||
pub struct Time {
 | 
					 | 
				
			||||||
    pub sec: u32,
 | 
					 | 
				
			||||||
    pub nsec: u32,
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
impl Time {
 | 
					 | 
				
			||||||
    pub fn from_packed(packed: u64) -> Time {
 | 
					 | 
				
			||||||
    Time {
 | 
					    Time {
 | 
				
			||||||
        sec: packed as u32,
 | 
					        sec: packed as u32,
 | 
				
			||||||
        nsec: (packed >> 32) as u32,
 | 
					        nsec: (packed >> 32) as u32,
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    }
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    pub fn parse(input: Input) -> IResult<Self> {
 | 
					pub fn parse_time(input: Input) -> IResult<Time> {
 | 
				
			||||||
        le_u64.map(Time::from_packed).parse(input)
 | 
					    le_u64.map(time_from_packed).parse(input)
 | 
				
			||||||
    }
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    pub fn read(input: Input) -> Result<Self> {
 | 
					pub fn read_time(input: Input) -> Result<Time> {
 | 
				
			||||||
        let (_, x) = Self::parse(input).map_err(FieldDataError::from)?;
 | 
					    let (_, x) = parse_time(input).map_err(FieldDataError::from)?;
 | 
				
			||||||
    Ok(x)
 | 
					    Ok(x)
 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
pub fn read_u32(input: Input) -> Result<u32> {
 | 
					pub fn read_u32(input: Input) -> Result<u32> {
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user