15
15
*/
16
16
package uk .co .real_logic .sbe .generation .rust ;
17
17
18
+ import org .agrona .Strings ;
18
19
import org .agrona .Verify ;
19
20
import org .agrona .generation .OutputManager ;
20
21
import uk .co .real_logic .sbe .PrimitiveType ;
@@ -119,7 +120,7 @@ public void generate() throws IOException
119
120
indent (writer , 0 , "version = \" 0.1.0\" \n " );
120
121
indent (writer , 0 , "authors = [\" sbetool\" ]\n " );
121
122
indent (writer , 0 , "description = \" %s\" \n " , ir .description ());
122
- indent (writer , 0 , "edition = \" 2018 \" \n \n " );
123
+ indent (writer , 0 , "edition = \" 2021 \" \n \n " );
123
124
indent (writer , 0 , "[lib]\n " );
124
125
indent (writer , 0 , "name = \" %s\" \n " , namespace );
125
126
indent (writer , 0 , "path = \" src/lib.rs\" \n " );
@@ -151,8 +152,8 @@ public void generate() throws IOException
151
152
try (Writer out = outputManager .createOutput (codecModName ))
152
153
{
153
154
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 ()) );
156
157
final String blockLengthType = blockLengthType ();
157
158
final String templateIdType = rustTypeName (ir .headerStructure ().templateIdType ());
158
159
final String schemaIdType = rustTypeName (ir .headerStructure ().schemaIdType ());
@@ -274,7 +275,18 @@ static void generateEncoderGroups(
274
275
final Token numInGroupToken = Generators .findFirst ("numInGroup" , tokens , index );
275
276
final PrimitiveType numInGroupPrimitiveType = numInGroupToken .encoding ().primitiveType ();
276
277
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
+
278
290
assert 4 == groupHeaderTokenCount ;
279
291
indent (sb , level , "#[inline]\n " );
280
292
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(
553
565
decoderName ,
554
566
decoderTypeName );
555
567
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 ());
557
569
indent (sb , level + 2 , "return Either::Left(self);\n " );
558
570
indent (sb , level + 1 , "}\n \n " );
559
571
@@ -587,7 +599,7 @@ private static void generateBitSetDecoder(
587
599
588
600
if (bitsetToken .version () > 0 )
589
601
{
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 ());
591
603
indent (sb , level + 2 , "return %s::default();\n " , structTypeName );
592
604
indent (sb , level + 1 , "}\n \n " );
593
605
}
@@ -647,7 +659,7 @@ private static void generatePrimitiveArrayDecoder(
647
659
648
660
if (fieldToken .version () > 0 )
649
661
{
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 ());
651
663
indent (sb , level + 2 , "return [%s; %d];\n " , encoding .applicableNullValue (), arrayLength );
652
664
indent (sb , level + 1 , "}\n \n " );
653
665
}
@@ -756,7 +768,7 @@ private static void generatePrimitiveOptionalDecoder(
756
768
757
769
if (fieldToken .version () > 0 )
758
770
{
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 ());
760
772
indent (sb , level + 2 , "return None;\n " );
761
773
indent (sb , level + 1 , "}\n \n " );
762
774
}
@@ -809,7 +821,7 @@ private static void generatePrimitiveRequiredDecoder(
809
821
810
822
if (fieldToken .version () > 0 )
811
823
{
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 ());
813
825
indent (sb , level + 2 , "return %s;\n " ,
814
826
generateRustLiteral (encoding .primitiveType (), encoding .applicableNullValue ().toString ()));
815
827
indent (sb , level + 1 , "}\n \n " );
@@ -897,9 +909,19 @@ static void generateDecoderGroups(
897
909
i = collectVarData (tokens , i , varData );
898
910
899
911
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
+ }
902
923
924
+ assert 4 == groupHeaderTokenCount ;
903
925
indent (sb , level , "#[inline]\n " );
904
926
if (groupToken .version () > 0 )
905
927
{
@@ -910,18 +932,14 @@ static void generateDecoderGroups(
910
932
indent (sb , level + 2 , "return None;\n " );
911
933
indent (sb , level + 1 , "}\n \n " );
912
934
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 );
916
936
}
917
937
else
918
938
{
919
939
indent (sb , level , "pub fn %s(self) -> %2$s<Self> {\n " ,
920
940
formatFunctionName (groupName ), groupName );
921
941
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 );
925
943
}
926
944
indent (sb , level , "}\n \n " );
927
945
@@ -958,7 +976,8 @@ static void generateDecoderVarData(
958
976
{
959
977
if (varDataToken .version () > 0 )
960
978
{
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 ());
962
981
indent (sb , level + 2 , "return (self.parent.as_ref().unwrap().get_limit(), 0);\n " );
963
982
indent (sb , level + 1 , "}\n \n " );
964
983
}
@@ -973,7 +992,8 @@ static void generateDecoderVarData(
973
992
{
974
993
if (varDataToken .version () > 0 )
975
994
{
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 ());
977
997
indent (sb , level + 2 , "return (self.get_limit(), 0);\n " );
978
998
indent (sb , level + 1 , "}\n \n " );
979
999
}
@@ -992,7 +1012,8 @@ static void generateDecoderVarData(
992
1012
993
1013
if (varDataToken .version () > 0 )
994
1014
{
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 ());
996
1017
indent (sb , level + 2 , "return &[] as &[u8];\n " );
997
1018
indent (sb , level + 1 , "}\n \n " );
998
1019
}
@@ -1199,7 +1220,7 @@ private static void generateEnum(
1199
1220
throw new IllegalArgumentException ("No valid values provided for enum " + originalEnumName );
1200
1221
}
1201
1222
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 " );
1203
1224
final String primitiveType = rustTypeName (messageBody .get (0 ).encoding ().primitiveType ());
1204
1225
indent (writer , 0 , "#[repr(%s)]\n " , primitiveType );
1205
1226
indent (writer , 0 , "pub enum %s {\n " , enumRustName );
@@ -1216,16 +1237,11 @@ private static void generateEnum(
1216
1237
final Encoding encoding = messageBody .get (0 ).encoding ();
1217
1238
final CharSequence nullVal = generateRustLiteral (encoding .primitiveType (),
1218
1239
encoding .applicableNullValue ().toString ());
1240
+ indent (writer , 1 , "#[default]\n " );
1219
1241
indent (writer , 1 , "NullVal = %s, \n " , nullVal );
1220
1242
}
1221
1243
indent (writer , 0 , "}\n " );
1222
1244
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
-
1229
1245
// From impl
1230
1246
indent (writer , 0 , "impl From<%s> for %s {\n " , primitiveType , enumRustName );
1231
1247
indent (writer , 1 , "#[inline]\n " );
@@ -1271,8 +1287,8 @@ private static void generateComposite(
1271
1287
{
1272
1288
indent (out , 0 , "use crate::*;\n \n " );
1273
1289
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 ) );
1276
1292
1277
1293
final int encodedLength = tokens .get (0 ).encodedLength ();
1278
1294
if (encodedLength > 0 )
0 commit comments