Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
[Rust] defined new trait 'ActingVersion'
  • Loading branch information
Michael Ward committed Apr 4, 2024
commit 15d71d3e04bbb10ae89ee089077f7a0cd401b72e
Original file line number Diff line number Diff line change
Expand Up @@ -35,19 +35,23 @@ class LibRsDef
{
private final RustOutputManager outputManager;
private final ByteOrder byteOrder;
private final String schemaVersionType;

/**
* Create a new 'lib.rs' for the library being generated
*
* @param outputManager for generating the codecs to.
* @param byteOrder for the Encoding.
* @param outputManager for generating the codecs to.
* @param byteOrder for the Encoding.
* @param schemaVersionType for acting_version type
*/
LibRsDef(
final RustOutputManager outputManager,
final ByteOrder byteOrder)
final RustOutputManager outputManager,
final ByteOrder byteOrder,
final String schemaVersionType)
{
this.outputManager = outputManager;
this.byteOrder = byteOrder;
this.schemaVersionType = schemaVersionType;
}

void generate() throws IOException
Expand Down Expand Up @@ -82,7 +86,7 @@ void generate() throws IOException
generateEitherEnum(libRs);

generateEncoderTraits(libRs);
generateDecoderTraits(libRs);
generateDecoderTraits(schemaVersionType, libRs);

generateReadBuf(libRs, byteOrder);
generateWriteBuf(libRs, byteOrder);
Expand All @@ -101,8 +105,12 @@ static void generateEncoderTraits(final Writer writer) throws IOException
indent(writer, 0, "}\n\n");
}

static void generateDecoderTraits(final Writer writer) throws IOException
static void generateDecoderTraits( final String schemaVersionType, final Writer writer) throws IOException
{
indent(writer, 0, "pub trait ActingVersion {\n");
indent(writer, 1, "fn acting_version(&self) -> %s;\n", schemaVersionType);
indent(writer, 0, "}\n\n");

indent(writer, 0, "pub trait Reader<'a>: Sized {\n");
indent(writer, 1, "fn get_buf(&self) -> &ReadBuf<'a>;\n");
indent(writer, 0, "}\n\n");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ void generate(
}
else
{
RustGenerator.appendImplDecoderTrait(sb, msgTypeName);
RustGenerator.appendImplDecoderTrait(schemaVersionType(), sb, msgTypeName);
}

RustGenerator.appendImplWithLifetimeHeader(sb, msgTypeName); // impl start
Expand All @@ -92,7 +92,7 @@ void generate(
appendMessageHeaderDecoderFn(sb);

RustGenerator.generateDecoderFields(sb, fields, 2);
RustGenerator.generateDecoderGroups(sb, groups, 2, this);
RustGenerator.generateDecoderGroups(schemaVersionType(), sb, groups, 2, this);
RustGenerator.generateDecoderVarData(sb, varData, 2, false);
}
else
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -127,11 +127,11 @@ public void generate() throws IOException
}

// lib.rs
final LibRsDef libRsDef = new LibRsDef(outputManager, ir.byteOrder());
final LibRsDef libRsDef = new LibRsDef(outputManager, ir.byteOrder(), schemaVersionType());

generateEnums(ir, outputManager);
generateBitSets(ir, outputManager);
generateComposites(ir, outputManager);
generateComposites(schemaVersionType(), ir, outputManager);

for (final List<Token> tokens : ir.messages())
{
Expand Down Expand Up @@ -428,6 +428,7 @@ private static void generatePrimitiveEncoder(
indent(sb, level, "/// - semanticType: %s\n", encoding.semanticType());
indent(sb, level, "/// - encodedOffset: %d\n", typeToken.offset());
indent(sb, level, "/// - encodedLength: %d\n", typeToken.encodedLength());
indent(sb, level, "/// - version: %d\n", typeToken.version());
indent(sb, level, "#[inline]\n");
indent(sb, level, "pub fn %s(&mut self, value: %s) {\n",
formatFunctionName(name),
Expand Down Expand Up @@ -575,7 +576,7 @@ private static void generateCompositeDecoder(
decoderName,
decoderTypeName);

indent(sb, level + 1, "if self.acting_version > 0 && self.acting_version < %d {\n", fieldToken.version());
indent(sb, level + 1, "if self.acting_version() < %d {\n", fieldToken.version());
indent(sb, level + 2, "return Either::Left(self);\n");
indent(sb, level + 1, "}\n\n");

Expand Down Expand Up @@ -613,7 +614,7 @@ private static void generateBitSetDecoder(

if (bitsetToken.version() > 0)
{
indent(sb, level + 1, "if self.acting_version > 0 && self.acting_version < %d {\n", bitsetToken.version());
indent(sb, level + 1, "if self.acting_version() < %d {\n", bitsetToken.version());
indent(sb, level + 2, "return %s::default();\n", structTypeName);
indent(sb, level + 1, "}\n\n");
}
Expand Down Expand Up @@ -673,7 +674,7 @@ private static void generatePrimitiveArrayDecoder(

if (fieldToken.version() > 0)
{
indent(sb, level + 1, "if self.acting_version > 0 && self.acting_version < %d {\n", fieldToken.version());
indent(sb, level + 1, "if self.acting_version() < %d {\n", fieldToken.version());
indent(sb, level + 2, "return [%s; %d];\n", encoding.applicableNullValue(), arrayLength);
indent(sb, level + 1, "}\n\n");
}
Expand Down Expand Up @@ -827,7 +828,7 @@ private static void generatePrimitiveRequiredDecoder(

if (fieldToken.version() > 0)
{
indent(sb, level + 1, "if self.acting_version > 0 && self.acting_version < %d {\n", fieldToken.version());
indent(sb, level + 1, "if self.acting_version() < %d {\n", fieldToken.version());
indent(sb, level + 2, "return %s;\n",
generateRustLiteral(encoding.primitiveType(), encoding.applicableNullValue().toString()));
indent(sb, level + 1, "}\n\n");
Expand Down Expand Up @@ -876,7 +877,7 @@ private static void generateEnumDecoder(

if (fieldToken.version() > 0)
{
indent(sb, level + 1, "if self.acting_version < %d {\n", fieldToken.version());
indent(sb, level + 1, "if self.acting_version() < %d {\n", fieldToken.version());
indent(sb, level + 2, "return %s::default();\n", enumType);
indent(sb, level + 1, "}\n\n");
}
Expand All @@ -889,10 +890,11 @@ private static void generateEnumDecoder(
}

static void generateDecoderGroups(
final StringBuilder sb,
final List<Token> tokens,
final int level,
final ParentDef parentDef) throws IOException
final String schemaVersionType,
final StringBuilder sb,
final List<Token> tokens,
final int level,
final ParentDef parentDef) throws IOException
{
for (int i = 0, size = tokens.size(); i < size; i++)
{
Expand Down Expand Up @@ -936,7 +938,7 @@ static void generateDecoderGroups(
indent(sb, level, "pub fn %s(self) -> Option<%2$s<Self>> {\n",
formatFunctionName(groupName), groupName);

indent(sb, level + 1, "if self.acting_version < %d {\n", groupToken.version());
indent(sb, level + 1, "if self.acting_version() < %d {\n", groupToken.version());
indent(sb, level + 2, "return None;\n");
indent(sb, level + 1, "}\n\n");

Expand All @@ -952,7 +954,7 @@ static void generateDecoderGroups(
indent(sb, level, "}\n\n");

final SubGroup subGroup = parentDef.addSubGroup(groupName, level, groupToken);
subGroup.generateDecoder(tokens, fields, groups, varData, index);
subGroup.generateDecoder(schemaVersionType, tokens, fields, groups, varData, index);
}
}

Expand Down Expand Up @@ -984,7 +986,7 @@ static void generateDecoderVarData(
{
if (varDataToken.version() > 0)
{
indent(sb, level + 1, "if self.acting_version > 0 && self.acting_version < %d {\n",
indent(sb, level + 1, "if self.acting_version() < %d {\n",
varDataToken.version());
indent(sb, level + 2, "return (self.parent.as_ref().unwrap().get_limit(), 0);\n");
indent(sb, level + 1, "}\n\n");
Expand All @@ -1000,7 +1002,7 @@ static void generateDecoderVarData(
{
if (varDataToken.version() > 0)
{
indent(sb, level + 1, "if self.acting_version > 0 && self.acting_version < %d {\n",
indent(sb, level + 1, "if self.acting_version() < %d {\n",
varDataToken.version());
indent(sb, level + 2, "return (self.get_limit(), 0);\n");
indent(sb, level + 1, "}\n\n");
Expand All @@ -1020,7 +1022,7 @@ static void generateDecoderVarData(

if (varDataToken.version() > 0)
{
indent(sb, level + 1, "if self.acting_version > 0 && self.acting_version < %d {\n",
indent(sb, level + 1, "if self.acting_version() < %d {\n",
varDataToken.version());
indent(sb, level + 2, "return &[] as &[u8];\n");
indent(sb, level + 1, "}\n\n");
Expand Down Expand Up @@ -1162,9 +1164,17 @@ static void appendImplEncoderTrait(
}

static void appendImplDecoderTrait(
final Appendable out,
final String typeName) throws IOException
final String schemaVersionType,
final Appendable out,
final String typeName) throws IOException
{
indent(out, 1, "impl<%s> %s for %s {\n", BUF_LIFETIME, "ActingVersion", withLifetime(typeName));
indent(out, 2, "#[inline]\n");
indent(out, 2, "fn acting_version(&self) -> %s {\n", schemaVersionType);
indent(out, 3, "self.acting_version\n");
indent(out, 2, "}\n");
indent(out, 1, "}\n\n");

indent(out, 1, "impl<%s> %s for %s {\n", BUF_LIFETIME, withLifetime("Reader"), withLifetime(typeName));
indent(out, 2, "#[inline]\n");
indent(out, 2, "fn get_buf(&self) -> &ReadBuf<'a> {\n");
Expand Down Expand Up @@ -1271,19 +1281,21 @@ private static void generateEnum(
}

private static void generateComposites(
final Ir ir,
final RustOutputManager outputManager) throws IOException
final String schemaVersionType,
final Ir ir,
final RustOutputManager outputManager) throws IOException
{
for (final List<Token> tokens : ir.types())
{
if (!tokens.isEmpty() && tokens.get(0).signal() == Signal.BEGIN_COMPOSITE)
{
generateComposite(tokens, outputManager);
generateComposite(schemaVersionType, tokens, outputManager);
}
}
}

private static void generateComposite(
final String schemaVersionType,
final List<Token> tokens,
final RustOutputManager outputManager) throws IOException
{
Expand All @@ -1306,7 +1318,7 @@ private static void generateComposite(

generateCompositeEncoder(tokens, encoderName(compositeName), out);
indent(out, 0, "\n");
generateCompositeDecoder(tokens, decoderName(compositeName), out);
generateCompositeDecoder(schemaVersionType, tokens, decoderName(compositeName), out);
}
}

Expand Down Expand Up @@ -1350,12 +1362,22 @@ static void appendImplEncoderForComposite(
}

static void appendImplReaderForComposite(
final String schemaVersionType,
final int version,
final Appendable out,
final int level,
final String name) throws IOException
{
indent(out, level, "impl<'a, P> ActingVersion for %s<P> where P: Reader<'a> + ActingVersion + Default {\n", name);
indent(out, level + 1, "#[inline]\n");
indent(out, level + 1, "fn acting_version(&self) -> %s {\n", schemaVersionType);
indent(out, level + 2, "self.parent.as_ref().unwrap().acting_version()\n");
indent(out, level + 1, "}\n");
indent(out, level, "}\n\n");

// impl Reader...
indent(out, level, "impl<'a, P> Reader<'a> for %s<P> where P: Reader<'a> + Default {\n", name);
indent(out, level, "impl<'a, P> Reader<'a> for %s<P> where P: Reader<'a> %s+ Default {\n",
name, version > 0 ? "+ ActingVersion " : "");
indent(out, level + 1, "#[inline]\n");
indent(out, level + 1, "fn get_buf(&self) -> &ReadBuf<'a> {\n");
indent(out, level + 2, "self.parent.as_ref().expect(\"parent missing\").get_buf()\n");
Expand All @@ -1364,14 +1386,16 @@ static void appendImplReaderForComposite(
}

static void appendImplDecoderForComposite(
final Appendable out,
final int level,
final String name) throws IOException
final String schemaVersionType,
final int version,
final Appendable out,
final int level,
final String name) throws IOException
{
appendImplReaderForComposite(out, level, name);
appendImplReaderForComposite(schemaVersionType, version, out, level, name);

// impl Decoder...
indent(out, level, "impl<'a, P> Decoder<'a> for %s<P> where P: Decoder<'a> + Default {\n", name);
indent(out, level, "impl<'a, P> Decoder<'a> for %s<P> where P: Decoder<'a> + ActingVersion + Default {\n", name);
indent(out, level + 1, "#[inline]\n");
indent(out, level + 1, "fn get_limit(&self) -> usize {\n");
indent(out, level + 2, "self.parent.as_ref().expect(\"parent missing\").get_limit()\n");
Expand Down Expand Up @@ -1447,6 +1471,7 @@ private static void generateCompositeEncoder(
}

private static void generateCompositeDecoder(
final String schemaVersionType,
final List<Token> tokens,
final String decoderName,
final Writer out) throws IOException
Expand All @@ -1460,10 +1485,12 @@ private static void generateCompositeDecoder(
indent(out, 2, "offset: usize,\n");
indent(out, 1, "}\n\n");

appendImplReaderForComposite(out, 1, decoderName);
final int version = tokens.stream().findFirst().get().version();
appendImplReaderForComposite(schemaVersionType, version, out, 1, decoderName);

// impl<'a, P> start
indent(out, 1, "impl<'a, P> %s<P> where P: Reader<'a> + Default {\n", decoderName);
indent(out, 1, "impl<'a, P> %s<P> where P: Reader<'a> %s+ Default {\n",
decoderName, version > 0 ? "+ ActingVersion " : "");
indent(out, 2, "pub fn wrap(mut self, parent: P, offset: usize) -> Self {\n");
indent(out, 3, "self.parent = Some(parent);\n");
indent(out, 3, "self.offset = offset;\n");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,7 @@ void generateEncoder(
}

void generateDecoder(
final String schemaVersionType,
final List<Token> tokens,
final List<Token> fields,
final List<Token> groups,
Expand All @@ -162,10 +163,11 @@ void generateDecoder(
indent(sb, level, "offset: usize,\n");
indent(sb, level - 1, "}\n\n");

RustGenerator.appendImplDecoderForComposite(sb, level - 1, name);
final int version = tokens.stream().findFirst().get().version();
RustGenerator.appendImplDecoderForComposite(schemaVersionType, version, sb, level - 1, name);

// define impl...
indent(sb, level - 1, "impl<'a, P> %s<P> where P: Decoder<'a> + Default {\n", name);
indent(sb, level - 1, "impl<'a, P> %s<P> where P: Decoder<'a> + ActingVersion + Default {\n", name);

final int dimensionHeaderSize = tokens.get(index).encodedLength();

Expand Down Expand Up @@ -197,6 +199,12 @@ void generateDecoder(
indent(sb, level + 1, "self.parent.take().ok_or(SbeErr::ParentNotSet)\n");
indent(sb, level, "}\n\n");

// acting_version fn...
indent(sb, level, "#[inline]\n");
indent(sb, level, "pub fn acting_version(&mut self) -> %s {\n", schemaVersionType);
indent(sb, level + 1, "self.parent.as_ref().unwrap().acting_version()\n");
indent(sb, level, "}\n\n");

// count function
indent(sb, level, "#[inline]\n");
indent(sb, level, "pub fn count(&self) -> %s {\n", rustTypeName(numInGroupPrimitiveType));
Expand All @@ -221,7 +229,7 @@ void generateDecoder(
indent(sb, level, "}\n\n");

RustGenerator.generateDecoderFields(sb, fields, level);
RustGenerator.generateDecoderGroups(sb, groups, level, this);
RustGenerator.generateDecoderGroups(schemaVersionType, sb, groups, level, this);
RustGenerator.generateDecoderVarData(sb, varData, level, true);

indent(sb, level - 1, "}\n\n"); // close impl
Expand Down