1
+ use anyhow:: Context as _;
1
2
use arrow:: {
2
3
array:: {
3
4
ArrayBuilder , ArrowPrimitiveType , BinaryBuilder , BooleanBuilder , FixedSizeListBuilder ,
@@ -10,18 +11,43 @@ use arrow::{
10
11
Int64Type , UInt8Type , UInt16Type , UInt32Type , UInt64Type ,
11
12
} ,
12
13
} ;
14
+ use cdr_encoding:: CdrDeserializer ;
13
15
use re_chunk:: { Chunk , ChunkId } ;
14
- use re_types:: { ComponentDescriptor , reflection:: ComponentDescriptorExt as _} ;
15
-
16
- use crate :: parsers:: ros2msg:: reflection:: {
16
+ use re_ros_msg:: {
17
17
MessageSchema ,
18
- deserialize:: primitive_array:: PrimitiveArray ,
19
- deserialize:: { Value , decode_bytes} ,
18
+ deserialize:: { MapResolver , MessageSeed , Value , primitive_array:: PrimitiveArray } ,
20
19
message_spec:: { ArraySize , BuiltInType , ComplexType , MessageSpecification , Type } ,
21
20
} ;
22
- use crate :: parsers:: { MessageParser , ParserContext } ;
21
+ use re_types:: { ComponentDescriptor , reflection:: ComponentDescriptorExt as _} ;
22
+ use serde:: de:: DeserializeSeed as _;
23
+
24
+ use crate :: parsers:: { MessageParser , ParserContext , dds} ;
23
25
use crate :: { Error , LayerIdentifier , MessageLayer } ;
24
26
27
+ pub fn decode_bytes ( top : & MessageSchema , buf : & [ u8 ] ) -> anyhow:: Result < Value > {
28
+ // 4-byte encapsulation header
29
+ if buf. len ( ) < 4 {
30
+ anyhow:: bail!( "short encapsulation" ) ;
31
+ }
32
+
33
+ let representation_identifier = dds:: RepresentationIdentifier :: from_bytes ( [ buf[ 0 ] , buf[ 1 ] ] )
34
+ . with_context ( || "failed to parse CDR representation identifier" ) ?;
35
+
36
+ let resolver = MapResolver :: new ( top. dependencies . iter ( ) . map ( |dep| ( dep. name . clone ( ) , dep) ) ) ;
37
+
38
+ let seed = MessageSeed :: new ( & top. spec , & resolver) ;
39
+
40
+ if representation_identifier. is_big_endian ( ) {
41
+ let mut de = CdrDeserializer :: < byteorder:: BigEndian > :: new ( & buf[ 4 ..] ) ;
42
+ seed. deserialize ( & mut de)
43
+ . with_context ( || "failed to deserialize CDR message" )
44
+ } else {
45
+ let mut de = CdrDeserializer :: < byteorder:: LittleEndian > :: new ( & buf[ 4 ..] ) ;
46
+ seed. deserialize ( & mut de)
47
+ . with_context ( || "failed to deserialize CDR message" )
48
+ }
49
+ }
50
+
25
51
struct Ros2ReflectionMessageParser {
26
52
num_rows : usize ,
27
53
message_schema : MessageSchema ,
@@ -260,7 +286,7 @@ fn append_value(
260
286
261
287
struct_builder. append ( true ) ;
262
288
}
263
- Value :: Array ( vec) | Value :: Seq ( vec) => {
289
+ Value :: Array ( vec) | Value :: Sequence ( vec) => {
264
290
let list_builder = downcast_err :: < ListBuilder < Box < dyn ArrayBuilder > > > ( builder) ?;
265
291
266
292
for val in vec {
0 commit comments