Skip to content

Commit

Permalink
[Rust] Updated RustGenerator.generatePrimitiveOptionalDecoder() to re…
Browse files Browse the repository at this point in the history
…solve Issue #972 (#981)

Co-authored-by: Michael Ward <mward@drw.com>
  • Loading branch information
mward and Michael Ward committed Mar 21, 2024
1 parent 4c32cfb commit 6d3f6b6
Show file tree
Hide file tree
Showing 5 changed files with 64 additions and 8 deletions.
1 change: 1 addition & 0 deletions build.gradle
Expand Up @@ -587,6 +587,7 @@ tasks.register('generateRustTestCodecs', JavaExec) {
'sbe.validation.xsd': validationXsdPath)
args = ['sbe-tool/src/test/resources/issue435.xml',
'sbe-tool/src/test/resources/issue895.xml',
'sbe-tool/src/test/resources/issue972.xml',
'sbe-tool/src/test/resources/example-bigendian-test-schema.xml',
'sbe-tool/src/test/resources/nested-composite-name.xml',
]
Expand Down
1 change: 1 addition & 0 deletions rust/Cargo.toml
Expand Up @@ -13,6 +13,7 @@ examples_uk_co_real_logic_sbe_benchmarks_fix = { path = "../generated/rust/uk_co

issue_435 = { path = "../generated/rust/issue435" }
issue_895 = { path = "../generated/rust/issue895" }
issue_972 = { path = "../generated/rust/issue972" }
baseline_bigendian = { path = "../generated/rust/baseline-bigendian" }
nested_composite_name = { path = "../generated/rust/nested-composite-name" }

Expand Down
37 changes: 37 additions & 0 deletions rust/tests/issue_972_test.rs
@@ -0,0 +1,37 @@
use issue_972::*;

fn create_encoder(buffer: &mut Vec<u8>) -> Issue972Encoder {
let issue_972 = Issue972Encoder::default().wrap(
WriteBuf::new(buffer.as_mut_slice()),
message_header_codec::ENCODED_LENGTH,
);
let mut header = issue_972.header(0);
header.parent().unwrap()
}

#[test]
fn round_trip() -> SbeResult<()> {
// encode...
let mut buffer = vec![0u8; 256];
let encoder = create_encoder(&mut buffer);
let mut new_composite_encoder = encoder.new_field_encoder();
new_composite_encoder.f1(2007);
new_composite_encoder.f2(2012);

// decode...
let buf = ReadBuf::new(buffer.as_slice());
let header = MessageHeaderDecoder::default().wrap(buf, 0);
assert_eq!(SBE_BLOCK_LENGTH, header.block_length());
assert_eq!(SBE_SCHEMA_VERSION, header.version());
assert_eq!(SBE_TEMPLATE_ID, header.template_id());
assert_eq!(SBE_SCHEMA_ID, header.schema_id());

let decoder = Issue972Decoder::default().header(header);
if let Either::Right(composite) = decoder.new_field_decoder() {
assert_eq!(2007, composite.f1().unwrap());
assert_eq!(2012, composite.f2().unwrap());
} else {
panic!()
}
Ok(())
}
Expand Up @@ -766,18 +766,10 @@ private static void generatePrimitiveOptionalDecoder(
formatFunctionName(name),
rustPrimitiveType);

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

indent(sb, level + 1, "let value = self.get_buf().get_%s_at(self.%s);\n",
rustPrimitiveType,
getBufOffset(fieldToken));


final String literal = generateRustLiteral(primitiveType, encoding.applicableNullValue().toString());
if (literal.endsWith("::NAN"))
{
Expand Down
25 changes: 25 additions & 0 deletions sbe-tool/src/test/resources/issue972.xml
@@ -0,0 +1,25 @@
<sbe:messageSchema
xmlns:sbe="http://fixprotocol.io/2016/sbe"
package="issue972"
id="972"
version="2"
semanticVersion="5.0.0"
byteOrder="littleEndian">
<types>
<composite name="messageHeader">
<type name="blockLength" primitiveType="uint16" description="Length of the root of the FIX message contained before repeating groups or variable/conditions fields."/>
<type name="templateId" primitiveType="uint16" description="Template ID used to encode the message."/>
<type name="schemaId" primitiveType="uint16" description="ID of the system publishing the message."/>
<type name="version" primitiveType="uint16" description="Schema version."/>
</composite>

<composite name="NewComposite" sinceVersion="1">
<type name="f1" primitiveType="uint16" presence="optional" nullValue="0" semanticType="Int"/>
<type name="f2" primitiveType="uint32" presence="optional" nullValue="0" semanticType="Int" offset="4"/>
</composite>
</types>
<sbe:message name="issue972" id="1">
<field name="oldField" id="1" type="uint16" semanticType="Int"/>
<field name="newField" id="2" type="NewComposite" presence="optional" sinceVersion="1" />
</sbe:message>
</sbe:messageSchema>

0 comments on commit 6d3f6b6

Please sign in to comment.