mcap2arrow_ros2msg/
lib.rs1mod parser;
21
22use mcap2arrow_core::{
23 DecoderError, EncodingKey, MessageDecoder, MessageEncoding, SchemaEncoding, TopicDecoder,
24};
25use mcap2arrow_ros2_common::{ResolvedSchema, Ros2CdrTopicDecoder, resolve_single_struct};
26pub use parser::parse_msg;
27
28pub struct Ros2MsgDecoder;
30
31impl Ros2MsgDecoder {
32 pub fn new() -> Self {
33 Self
34 }
35}
36
37impl Default for Ros2MsgDecoder {
38 fn default() -> Self {
39 Self::new()
40 }
41}
42
43impl MessageDecoder for Ros2MsgDecoder {
44 fn encoding_key(&self) -> EncodingKey {
45 EncodingKey::new(SchemaEncoding::Ros2Msg, MessageEncoding::Cdr)
46 }
47
48 fn build_topic_decoder(
49 &self,
50 schema_name: &str,
51 schema_data: &[u8],
52 ) -> Result<Box<dyn TopicDecoder>, DecoderError> {
53 let resolved = resolve_for_cdr(schema_name, schema_data)?;
54 Ok(Box::new(Ros2CdrTopicDecoder::new(resolved)))
55 }
56}
57
58pub fn resolve_for_cdr(
60 schema_name: &str,
61 schema_data: &[u8],
62) -> Result<ResolvedSchema, DecoderError> {
63 let schema_str = std::str::from_utf8(schema_data).map_err(|e| DecoderError::SchemaParse {
64 schema_name: schema_name.to_string(),
65 source: Box::new(e),
66 })?;
67 let struct_def = parse_msg(schema_name, schema_str).map_err(|e| DecoderError::SchemaParse {
68 schema_name: schema_name.to_string(),
69 source: e.into(),
70 })?;
71 resolve_single_struct(schema_name, struct_def).map_err(|e| DecoderError::SchemaParse {
72 schema_name: schema_name.to_string(),
73 source: e.into(),
74 })
75}