@@ -53,6 +53,8 @@ public RustGenerator(final Ir ir, final OutputManager outputManager)
5353
5454 public void generate () throws IOException
5555 {
56+ final int headerSize = totalByteSize (ir .headerStructure ());
57+
5658 generateSharedImports (outputManager );
5759 generateResultEnums (outputManager );
5860 generateDecoderScratchStruct (outputManager );
@@ -61,7 +63,7 @@ public void generate() throws IOException
6163 generateEnums (ir , outputManager );
6264 generateComposites (ir , outputManager );
6365 generateBitSets (ir , outputManager );
64- final int headerSize = totalByteSize ( ir . headerStructure () );
66+ generateMessageHeaderDecoder ( outputManager , headerSize );
6567
6668 for (final List <Token > tokens : ir .messages ())
6769 {
@@ -285,6 +287,27 @@ private static void generateEntryPoint(
285287 }
286288 }
287289
290+ static void generateMessageHeaderDecoder (
291+ final OutputManager outputManager ,
292+ final int headerSize ) throws IOException
293+ {
294+ final String messageTypeName = "MessageHeader" ;
295+ final RustCodecType codecType = RustCodecType .Decoder ;
296+ try (Writer writer = outputManager .createOutput (messageTypeName + format (" %s entry point" , codecType .name ())))
297+ {
298+ final String gerund = codecType .gerund ();
299+ writer .append (format ("pub fn start_%s_%s<%s>(data: &%s%s [u8]) -> CodecResult<(&%s %s, %s)> {\n " , gerund ,
300+ formatMethodName (messageTypeName ), DATA_LIFETIME , DATA_LIFETIME ,
301+ codecType == RustCodecType .Encoder ? " mut" : "" ,
302+ DATA_LIFETIME , messageTypeName ,
303+ withLifetime (codecType .scratchType ())));
304+ indent (writer , 1 , format ("let mut scratch = %s { data: data, pos: 0 };\n " , codecType .scratchType ()));
305+ indent (writer , 1 , format ("let v = scratch.read_type::<%s>(%s)?;\n " , messageTypeName , headerSize ));
306+ indent (writer , 1 , "Ok((v, scratch))\n " );
307+ writer .append ("}\n " );
308+ }
309+ }
310+
288311 static String withLifetime (final String typeName )
289312 {
290313 return format ("%s<%s>" , typeName , DATA_LIFETIME );
@@ -1163,7 +1186,7 @@ static void generateEncoderScratchStruct(final OutputManager outputManager) thro
11631186 try (Writer writer = outputManager .createOutput ("Scratch Encoder Data Wrapper - codec internal use only" ))
11641187 {
11651188 writer .append ("#[derive(Debug)]\n " );
1166- writer .append (format ("struct %s<%s> {\n " , SCRATCH_ENCODER_TYPE , DATA_LIFETIME ));
1189+ writer .append (format ("pub struct %s<%s> {\n " , SCRATCH_ENCODER_TYPE , DATA_LIFETIME ));
11671190 indent (writer , 1 , "data: &%s mut [u8],\n " , DATA_LIFETIME );
11681191 indent (writer ).append ("pos: usize,\n " );
11691192 writer .append ("}\n " );
@@ -1291,7 +1314,7 @@ private static void generateDecoderScratchStruct(final OutputManager outputManag
12911314 try (Writer writer = outputManager .createOutput ("Scratch Decoder Data Wrapper - codec internal use only" ))
12921315 {
12931316 writer .append ("#[derive(Debug)]\n " );
1294- writer .append (format ("struct %s<%s> {\n " , SCRATCH_DECODER_TYPE , DATA_LIFETIME ));
1317+ writer .append (format ("pub struct %s<%s> {\n " , SCRATCH_DECODER_TYPE , DATA_LIFETIME ));
12951318 indent (writer , 1 , "data: &%s [u8],\n " , DATA_LIFETIME );
12961319 indent (writer ).append ("pos: usize,\n " );
12971320 writer .append ("}\n " );
@@ -1798,6 +1821,18 @@ private void generateMessageHeaderDefault(
17981821 indent (writer , 1 , "pub message_header: MessageHeader\n " );
17991822 writer .append ("}\n " );
18001823
1824+ final String blockLength = Integer .toString (messageToken .encodedLength ());
1825+ final String templateId = Integer .toString (messageToken .id ());
1826+ final String schemaId = Integer .toString (ir .id ());
1827+ final String version = Integer .toString (ir .version ());
1828+
1829+ indent (writer , 0 , "impl %s {\n " , wrapperName );
1830+ indent (writer , 1 , "pub const BLOCK_LENGTH : u16 = " + blockLength + ";\n " );
1831+ indent (writer , 1 , "pub const TEMPLATE_ID : u16 = " + templateId + ";\n " );
1832+ indent (writer , 1 , "pub const SCHEMA_ID : u16 = " + schemaId + ";\n " );
1833+ indent (writer , 1 , "pub const VERSION : u16 = " + version + ";\n " );
1834+ indent (writer , 0 , "}\n " );
1835+
18011836 indent (writer , 0 , "impl Default for %s {\n " , wrapperName );
18021837 indent (writer , 1 , "fn default() -> %s {\n " , wrapperName );
18031838 indent (writer , 2 , "%s {\n " , wrapperName );
@@ -1807,10 +1842,10 @@ private void generateMessageHeaderDefault(
18071842 new HashMap <String , String >()
18081843 {
18091844 {
1810- put ("block_length" , Integer . toString ( messageToken . encodedLength ()) );
1811- put ("template_id" , Integer . toString ( messageToken . id ()) );
1812- put ("schema_id" , Integer . toString ( ir . id ()) );
1813- put ("version" , Integer . toString ( ir . version ()) );
1845+ put ("block_length" , blockLength );
1846+ put ("template_id" , templateId );
1847+ put ("schema_id" , schemaId );
1848+ put ("version" , version );
18141849 }
18151850 });
18161851
0 commit comments