1515 */
1616package uk .co .real_logic .sbe .generation .rust ;
1717
18+ import org .agrona .Strings ;
1819import org .agrona .Verify ;
1920import org .agrona .generation .OutputManager ;
2021import uk .co .real_logic .sbe .PrimitiveType ;
@@ -119,7 +120,7 @@ public void generate() throws IOException
119120 indent (writer , 0 , "version = \" 0.1.0\" \n " );
120121 indent (writer , 0 , "authors = [\" sbetool\" ]\n " );
121122 indent (writer , 0 , "description = \" %s\" \n " , ir .description ());
122- indent (writer , 0 , "edition = \" 2018 \" \n \n " );
123+ indent (writer , 0 , "edition = \" 2021 \" \n \n " );
123124 indent (writer , 0 , "[lib]\n " );
124125 indent (writer , 0 , "name = \" %s\" \n " , namespace );
125126 indent (writer , 0 , "path = \" src/lib.rs\" \n " );
@@ -151,8 +152,8 @@ public void generate() throws IOException
151152 try (Writer out = outputManager .createOutput (codecModName ))
152153 {
153154 indent (out , 0 , "use crate::*;\n \n " );
154- indent (out , 0 , "pub use encoder::* ;\n " );
155- indent (out , 0 , "pub use decoder::* ;\n \n " );
155+ indent (out , 0 , "pub use encoder::%sEncoder ;\n " , formatStructName ( msgToken . name ()) );
156+ indent (out , 0 , "pub use decoder::%sDecoder ;\n \n " , formatStructName ( msgToken . name ()) );
156157 final String blockLengthType = blockLengthType ();
157158 final String templateIdType = rustTypeName (ir .headerStructure ().templateIdType ());
158159 final String schemaIdType = rustTypeName (ir .headerStructure ().schemaIdType ());
@@ -274,7 +275,18 @@ static void generateEncoderGroups(
274275 final Token numInGroupToken = Generators .findFirst ("numInGroup" , tokens , index );
275276 final PrimitiveType numInGroupPrimitiveType = numInGroupToken .encoding ().primitiveType ();
276277
277- indent (sb , level , "/// GROUP ENCODER\n " );
278+ final String description = groupToken .description ();
279+ if (!Strings .isEmpty (description ))
280+ {
281+ indent (sb , level , "/// GROUP ENCODER (id=%s, description='%s')\n " ,
282+ groupToken .id (), description );
283+ }
284+ else
285+ {
286+ indent (sb , level , "/// GROUP ENCODER (id=%s)\n " ,
287+ groupToken .id ());
288+ }
289+
278290 assert 4 == groupHeaderTokenCount ;
279291 indent (sb , level , "#[inline]\n " );
280292 indent (sb , level , "pub fn %s(self, count: %s, %1$s: %3$s<Self>) -> %3$s<Self> {\n " ,
@@ -553,7 +565,7 @@ private static void generateCompositeDecoder(
553565 decoderName ,
554566 decoderTypeName );
555567
556- indent (sb , level + 1 , "if self.acting_version < %d {\n " , fieldToken .version ());
568+ indent (sb , level + 1 , "if self.acting_version > 0 && self.acting_version < %d {\n " , fieldToken .version ());
557569 indent (sb , level + 2 , "return Either::Left(self);\n " );
558570 indent (sb , level + 1 , "}\n \n " );
559571
@@ -587,7 +599,7 @@ private static void generateBitSetDecoder(
587599
588600 if (bitsetToken .version () > 0 )
589601 {
590- indent (sb , level + 1 , "if self.acting_version < %d {\n " , bitsetToken .version ());
602+ indent (sb , level + 1 , "if self.acting_version > 0 && self.acting_version < %d {\n " , bitsetToken .version ());
591603 indent (sb , level + 2 , "return %s::default();\n " , structTypeName );
592604 indent (sb , level + 1 , "}\n \n " );
593605 }
@@ -647,7 +659,7 @@ private static void generatePrimitiveArrayDecoder(
647659
648660 if (fieldToken .version () > 0 )
649661 {
650- indent (sb , level + 1 , "if self.acting_version < %d {\n " , fieldToken .version ());
662+ indent (sb , level + 1 , "if self.acting_version > 0 && self.acting_version < %d {\n " , fieldToken .version ());
651663 indent (sb , level + 2 , "return [%s; %d];\n " , encoding .applicableNullValue (), arrayLength );
652664 indent (sb , level + 1 , "}\n \n " );
653665 }
@@ -756,7 +768,7 @@ private static void generatePrimitiveOptionalDecoder(
756768
757769 if (fieldToken .version () > 0 )
758770 {
759- indent (sb , level + 1 , "if self.acting_version < %d {\n " , fieldToken .version ());
771+ indent (sb , level + 1 , "if self.acting_version > 0 && self.acting_version < %d {\n " , fieldToken .version ());
760772 indent (sb , level + 2 , "return None;\n " );
761773 indent (sb , level + 1 , "}\n \n " );
762774 }
@@ -809,7 +821,7 @@ private static void generatePrimitiveRequiredDecoder(
809821
810822 if (fieldToken .version () > 0 )
811823 {
812- indent (sb , level + 1 , "if self.acting_version < %d {\n " , fieldToken .version ());
824+ indent (sb , level + 1 , "if self.acting_version > 0 && self.acting_version < %d {\n " , fieldToken .version ());
813825 indent (sb , level + 2 , "return %s;\n " ,
814826 generateRustLiteral (encoding .primitiveType (), encoding .applicableNullValue ().toString ()));
815827 indent (sb , level + 1 , "}\n \n " );
@@ -897,9 +909,19 @@ static void generateDecoderGroups(
897909 i = collectVarData (tokens , i , varData );
898910
899911 final String groupName = decoderName (formatStructName (groupToken .name ()));
900- indent (sb , level , "/// GROUP DECODER\n " );
901- assert 4 == groupHeaderTokenCount ;
912+ final String description = groupToken .description ();
913+ if (!Strings .isEmpty (description ))
914+ {
915+ indent (sb , level , "/// GROUP DECODER (id=%s, description='%s')\n " ,
916+ groupToken .id (), description );
917+ }
918+ else
919+ {
920+ indent (sb , level , "/// GROUP DECODER (id=%s)\n " ,
921+ groupToken .id ());
922+ }
902923
924+ assert 4 == groupHeaderTokenCount ;
903925 indent (sb , level , "#[inline]\n " );
904926 if (groupToken .version () > 0 )
905927 {
@@ -910,18 +932,14 @@ static void generateDecoderGroups(
910932 indent (sb , level + 2 , "return None;\n " );
911933 indent (sb , level + 1 , "}\n \n " );
912934
913- indent (sb , level + 1 , "let acting_version = self.acting_version;\n " );
914- indent (sb , level + 1 , "Some(%s::default().wrap(self, acting_version as usize))\n " ,
915- groupName );
935+ indent (sb , level + 1 , "Some(%s::default().wrap(self))\n " , groupName );
916936 }
917937 else
918938 {
919939 indent (sb , level , "pub fn %s(self) -> %2$s<Self> {\n " ,
920940 formatFunctionName (groupName ), groupName );
921941
922- indent (sb , level + 1 , "let acting_version = self.acting_version;\n " );
923- indent (sb , level + 1 , "%s::default().wrap(self, acting_version as usize)\n " ,
924- groupName );
942+ indent (sb , level + 1 , "%s::default().wrap(self)\n " , groupName );
925943 }
926944 indent (sb , level , "}\n \n " );
927945
@@ -958,7 +976,8 @@ static void generateDecoderVarData(
958976 {
959977 if (varDataToken .version () > 0 )
960978 {
961- indent (sb , level + 1 , "if self.acting_version < %d {\n " , varDataToken .version ());
979+ indent (sb , level + 1 , "if self.acting_version > 0 && self.acting_version < %d {\n " ,
980+ varDataToken .version ());
962981 indent (sb , level + 2 , "return (self.parent.as_ref().unwrap().get_limit(), 0);\n " );
963982 indent (sb , level + 1 , "}\n \n " );
964983 }
@@ -973,7 +992,8 @@ static void generateDecoderVarData(
973992 {
974993 if (varDataToken .version () > 0 )
975994 {
976- indent (sb , level + 1 , "if self.acting_version < %d {\n " , varDataToken .version ());
995+ indent (sb , level + 1 , "if self.acting_version > 0 && self.acting_version < %d {\n " ,
996+ varDataToken .version ());
977997 indent (sb , level + 2 , "return (self.get_limit(), 0);\n " );
978998 indent (sb , level + 1 , "}\n \n " );
979999 }
@@ -992,7 +1012,8 @@ static void generateDecoderVarData(
9921012
9931013 if (varDataToken .version () > 0 )
9941014 {
995- indent (sb , level + 1 , "if self.acting_version < %d {\n " , varDataToken .version ());
1015+ indent (sb , level + 1 , "if self.acting_version > 0 && self.acting_version < %d {\n " ,
1016+ varDataToken .version ());
9961017 indent (sb , level + 2 , "return &[] as &[u8];\n " );
9971018 indent (sb , level + 1 , "}\n \n " );
9981019 }
@@ -1199,7 +1220,7 @@ private static void generateEnum(
11991220 throw new IllegalArgumentException ("No valid values provided for enum " + originalEnumName );
12001221 }
12011222
1202- indent (writer , 0 , "#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]\n " );
1223+ indent (writer , 0 , "#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]\n " );
12031224 final String primitiveType = rustTypeName (messageBody .get (0 ).encoding ().primitiveType ());
12041225 indent (writer , 0 , "#[repr(%s)]\n " , primitiveType );
12051226 indent (writer , 0 , "pub enum %s {\n " , enumRustName );
@@ -1216,16 +1237,11 @@ private static void generateEnum(
12161237 final Encoding encoding = messageBody .get (0 ).encoding ();
12171238 final CharSequence nullVal = generateRustLiteral (encoding .primitiveType (),
12181239 encoding .applicableNullValue ().toString ());
1240+ indent (writer , 1 , "#[default]\n " );
12191241 indent (writer , 1 , "NullVal = %s, \n " , nullVal );
12201242 }
12211243 indent (writer , 0 , "}\n " );
12221244
1223- // Default implementation to support Default in other structs
1224- indent (writer , 0 , "impl Default for %s {\n " , enumRustName );
1225- indent (writer , 1 , "#[inline]\n " );
1226- indent (writer , 1 , "fn default() -> Self { %s::%s }\n " , enumRustName , "NullVal" );
1227- indent (writer , 0 , "}\n " );
1228-
12291245 // From impl
12301246 indent (writer , 0 , "impl From<%s> for %s {\n " , primitiveType , enumRustName );
12311247 indent (writer , 1 , "#[inline]\n " );
@@ -1271,8 +1287,8 @@ private static void generateComposite(
12711287 {
12721288 indent (out , 0 , "use crate::*;\n \n " );
12731289
1274- indent (out , 0 , "pub use encoder::* ;\n " );
1275- indent (out , 0 , "pub use decoder::* ;\n \n " );
1290+ indent (out , 0 , "pub use encoder::%sEncoder ;\n " , formatStructName ( compositeName ) );
1291+ indent (out , 0 , "pub use decoder::%sDecoder ;\n \n " , formatStructName ( compositeName ) );
12761292
12771293 final int encodedLength = tokens .get (0 ).encodedLength ();
12781294 if (encodedLength > 0 )
0 commit comments