Skip to content

Commit 6d3f6b6

Browse files
mwardMichael Ward
and
Michael Ward
authored
[Rust] Updated RustGenerator.generatePrimitiveOptionalDecoder() to resolve Issue #972 (#981)
Co-authored-by: Michael Ward <mward@drw.com>
1 parent 4c32cfb commit 6d3f6b6

File tree

5 files changed

+64
-8
lines changed

5 files changed

+64
-8
lines changed

build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -587,6 +587,7 @@ tasks.register('generateRustTestCodecs', JavaExec) {
587587
'sbe.validation.xsd': validationXsdPath)
588588
args = ['sbe-tool/src/test/resources/issue435.xml',
589589
'sbe-tool/src/test/resources/issue895.xml',
590+
'sbe-tool/src/test/resources/issue972.xml',
590591
'sbe-tool/src/test/resources/example-bigendian-test-schema.xml',
591592
'sbe-tool/src/test/resources/nested-composite-name.xml',
592593
]

rust/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ examples_uk_co_real_logic_sbe_benchmarks_fix = { path = "../generated/rust/uk_co
1313

1414
issue_435 = { path = "../generated/rust/issue435" }
1515
issue_895 = { path = "../generated/rust/issue895" }
16+
issue_972 = { path = "../generated/rust/issue972" }
1617
baseline_bigendian = { path = "../generated/rust/baseline-bigendian" }
1718
nested_composite_name = { path = "../generated/rust/nested-composite-name" }
1819

rust/tests/issue_972_test.rs

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
use issue_972::*;
2+
3+
fn create_encoder(buffer: &mut Vec<u8>) -> Issue972Encoder {
4+
let issue_972 = Issue972Encoder::default().wrap(
5+
WriteBuf::new(buffer.as_mut_slice()),
6+
message_header_codec::ENCODED_LENGTH,
7+
);
8+
let mut header = issue_972.header(0);
9+
header.parent().unwrap()
10+
}
11+
12+
#[test]
13+
fn round_trip() -> SbeResult<()> {
14+
// encode...
15+
let mut buffer = vec![0u8; 256];
16+
let encoder = create_encoder(&mut buffer);
17+
let mut new_composite_encoder = encoder.new_field_encoder();
18+
new_composite_encoder.f1(2007);
19+
new_composite_encoder.f2(2012);
20+
21+
// decode...
22+
let buf = ReadBuf::new(buffer.as_slice());
23+
let header = MessageHeaderDecoder::default().wrap(buf, 0);
24+
assert_eq!(SBE_BLOCK_LENGTH, header.block_length());
25+
assert_eq!(SBE_SCHEMA_VERSION, header.version());
26+
assert_eq!(SBE_TEMPLATE_ID, header.template_id());
27+
assert_eq!(SBE_SCHEMA_ID, header.schema_id());
28+
29+
let decoder = Issue972Decoder::default().header(header);
30+
if let Either::Right(composite) = decoder.new_field_decoder() {
31+
assert_eq!(2007, composite.f1().unwrap());
32+
assert_eq!(2012, composite.f2().unwrap());
33+
} else {
34+
panic!()
35+
}
36+
Ok(())
37+
}

sbe-tool/src/main/java/uk/co/real_logic/sbe/generation/rust/RustGenerator.java

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -766,18 +766,10 @@ private static void generatePrimitiveOptionalDecoder(
766766
formatFunctionName(name),
767767
rustPrimitiveType);
768768

769-
if (fieldToken.version() > 0)
770-
{
771-
indent(sb, level + 1, "if self.acting_version > 0 && self.acting_version < %d {\n", fieldToken.version());
772-
indent(sb, level + 2, "return None;\n");
773-
indent(sb, level + 1, "}\n\n");
774-
}
775-
776769
indent(sb, level + 1, "let value = self.get_buf().get_%s_at(self.%s);\n",
777770
rustPrimitiveType,
778771
getBufOffset(fieldToken));
779772

780-
781773
final String literal = generateRustLiteral(primitiveType, encoding.applicableNullValue().toString());
782774
if (literal.endsWith("::NAN"))
783775
{
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
<sbe:messageSchema
2+
xmlns:sbe="http://fixprotocol.io/2016/sbe"
3+
package="issue972"
4+
id="972"
5+
version="2"
6+
semanticVersion="5.0.0"
7+
byteOrder="littleEndian">
8+
<types>
9+
<composite name="messageHeader">
10+
<type name="blockLength" primitiveType="uint16" description="Length of the root of the FIX message contained before repeating groups or variable/conditions fields."/>
11+
<type name="templateId" primitiveType="uint16" description="Template ID used to encode the message."/>
12+
<type name="schemaId" primitiveType="uint16" description="ID of the system publishing the message."/>
13+
<type name="version" primitiveType="uint16" description="Schema version."/>
14+
</composite>
15+
16+
<composite name="NewComposite" sinceVersion="1">
17+
<type name="f1" primitiveType="uint16" presence="optional" nullValue="0" semanticType="Int"/>
18+
<type name="f2" primitiveType="uint32" presence="optional" nullValue="0" semanticType="Int" offset="4"/>
19+
</composite>
20+
</types>
21+
<sbe:message name="issue972" id="1">
22+
<field name="oldField" id="1" type="uint16" semanticType="Int"/>
23+
<field name="newField" id="2" type="NewComposite" presence="optional" sinceVersion="1" />
24+
</sbe:message>
25+
</sbe:messageSchema>

0 commit comments

Comments
 (0)