2021-11-18 15:56:02 -08:00
|
|
|
use std::{convert::TryFrom, env::args, fs::File};
|
2021-11-18 15:11:56 -08:00
|
|
|
|
|
|
|
use log::{error, info, trace};
|
2021-11-18 15:56:02 -08:00
|
|
|
use regex::Regex;
|
|
|
|
use ros_message::{MessagePath, Msg};
|
|
|
|
use rsbag::{
|
|
|
|
index::{BagIndex, ConnInfo},
|
|
|
|
reader::IoReader,
|
|
|
|
};
|
|
|
|
|
|
|
|
fn parse_msgdef(message_name: &str, msgdef: &str) -> rsbag::Result<Msg> {
|
|
|
|
trace!("message definition: {}", msgdef);
|
|
|
|
let path = MessagePath::try_from(message_name).map_err(rsbag::Error::other)?;
|
|
|
|
let msgtype = Msg::new(path, msgdef).map_err(rsbag::Error::other)?;
|
|
|
|
Ok(msgtype)
|
|
|
|
}
|
|
|
|
|
|
|
|
fn parse_message_definitions(conn: &ConnInfo) -> rsbag::Result<Vec<Msg>> {
|
|
|
|
let msgdefs = conn.message_definition()?;
|
|
|
|
let boundary_re = Regex::new(r"\r?\n==+\r?\nMSG: ([^\r\n]+)\r?\n").unwrap();
|
|
|
|
let mut name = conn.datatype()?;
|
|
|
|
let mut begin = 0usize;
|
|
|
|
let mut msgs = Vec::new();
|
|
|
|
|
|
|
|
for cap in boundary_re.captures_iter(&msgdefs) {
|
|
|
|
let boundary_range = cap.get(0).unwrap();
|
|
|
|
let end = boundary_range.start();
|
|
|
|
|
|
|
|
let msgdef = &msgdefs[begin..end];
|
|
|
|
let msgtype = parse_msgdef(&name, msgdef)?;
|
|
|
|
msgs.push(msgtype);
|
|
|
|
|
|
|
|
name = cap[1].to_string();
|
|
|
|
begin = boundary_range.end();
|
|
|
|
}
|
|
|
|
|
|
|
|
let msgdef = &msgdefs[begin..];
|
|
|
|
|
|
|
|
let msg = parse_msgdef(&name, msgdef)?;
|
|
|
|
msgs.push(msg);
|
|
|
|
|
|
|
|
Ok(msgs)
|
|
|
|
}
|
2021-11-18 15:11:56 -08:00
|
|
|
|
|
|
|
fn main() {
|
|
|
|
env_logger::init();
|
|
|
|
|
|
|
|
let args: Vec<_> = args().collect();
|
|
|
|
if args.len() != 2 {
|
|
|
|
eprintln!("Usage: {} <bag path>", args[0]);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
let bag_path = &args[1];
|
|
|
|
let bag_file = File::open(bag_path).expect("Could not open bag file");
|
|
|
|
let mut bag_reader = IoReader::new(bag_file);
|
|
|
|
|
|
|
|
match BagIndex::read_all(&mut bag_reader) {
|
|
|
|
Ok(index) => {
|
|
|
|
for conn in &index.connections {
|
2021-11-18 15:56:02 -08:00
|
|
|
match parse_message_definitions(conn) {
|
|
|
|
Ok(msgs) => {
|
|
|
|
for msg in &msgs {
|
|
|
|
info!(
|
|
|
|
"message definition parsed: {:#?}",
|
|
|
|
msg.fields()
|
|
|
|
.iter()
|
|
|
|
.filter(|field| !field.is_constant())
|
|
|
|
.map(ToString::to_string)
|
|
|
|
.collect::<Vec<_>>()
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
Err(err) => error!("could not parse message definition: {}", err),
|
2021-11-18 15:11:56 -08:00
|
|
|
}
|
|
|
|
}
|
2021-11-18 15:56:02 -08:00
|
|
|
}
|
2021-11-18 15:11:56 -08:00
|
|
|
Err(err) => error!("bag parse error: {}", err),
|
|
|
|
}
|
|
|
|
}
|