Skip to content

Commit c5aab07

Browse files
mwardMichael Ward
and
Michael Ward
authored
[Rust] Updated code generator to resolve Issue #984 (#985)
* [Rust] updated code generator to prevent rust warning for "ambiguous glob re-exports" * [Rust] defined new trait 'ActingVersion' * fixed code formatting issues * [Rust] fixed benchmarks * [Rust] added test for issue 984 --------- Co-authored-by: Michael Ward <mward@drw.com>
1 parent 2fd4adb commit c5aab07

File tree

11 files changed

+174
-38
lines changed

11 files changed

+174
-38
lines changed

build.gradle

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

rust/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ examples_uk_co_real_logic_sbe_benchmarks_fix = { path = "../generated/rust/uk_co
1414
issue_435 = { path = "../generated/rust/issue435" }
1515
issue_895 = { path = "../generated/rust/issue895" }
1616
issue_972 = { path = "../generated/rust/issue972" }
17+
issue_984 = { path = "../generated/rust/issue984" }
1718
baseline_bigendian = { path = "../generated/rust/baseline-bigendian" }
1819
nested_composite_name = { path = "../generated/rust/nested-composite-name" }
1920

rust/benches/car_benchmark.rs

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,12 @@
1-
use car_codec::encoder::*;
21
use criterion::{black_box, criterion_group, criterion_main, Criterion};
3-
use examples_uk_co_real_logic_sbe_benchmarks::*;
2+
use examples_uk_co_real_logic_sbe_benchmarks::{
3+
boolean_type::BooleanType,
4+
car_codec::{decoder::*, encoder::*},
5+
message_header_codec::MessageHeaderDecoder,
6+
model::Model,
7+
optional_extras::OptionalExtras,
8+
*,
9+
};
410

511
const MANUFACTURER: &[u8] = b"MANUFACTURER";
612
const MODEL: &[u8] = b"MODEL";
@@ -36,8 +42,8 @@ fn encode(state: &mut State) -> SbeResult<usize> {
3642
car.model_year(2005);
3743
car.serial_number(12345);
3844
car.available(BooleanType::T);
39-
car.vehicle_code([97, 98, 99, 100, 101, 102]); // abcdef
40-
car.some_numbers([0, 1, 2, 3, 4]);
45+
car.vehicle_code(&[97, 98, 99, 100, 101, 102]); // abcdef
46+
car.some_numbers(&[0, 1, 2, 3, 4]);
4147

4248
extras.set_sports_pack(true);
4349
extras.set_sun_roof(true);
@@ -46,7 +52,7 @@ fn encode(state: &mut State) -> SbeResult<usize> {
4652
let mut engine = car.engine_encoder();
4753
engine.capacity(4200);
4854
engine.num_cylinders(8);
49-
engine.manufacturer_code([97, 98, 99]); // abc
55+
engine.manufacturer_code(&[97, 98, 99]); // abc
5056

5157
car = engine.parent()?;
5258
fuel_figures = car.fuel_figures_encoder(3, fuel_figures);

rust/benches/md_benchmark.rs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,12 @@
11
use criterion::{black_box, criterion_group, criterion_main, Criterion};
2-
use examples_uk_co_real_logic_sbe_benchmarks_fix::*;
3-
use market_data_incremental_refresh_trades_codec::encoder::*;
2+
use examples_uk_co_real_logic_sbe_benchmarks_fix::{
3+
market_data_incremental_refresh_trades_codec::{encoder::*, *},
4+
match_event_indicator::*,
5+
md_update_action::*,
6+
message_header_codec::*,
7+
side::*,
8+
*,
9+
};
410

511
struct State {
612
buffer: Vec<u8>,

rust/tests/issue_435_test.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
1-
use ::issue_435::*;
21
use issue_435::{
32
enum_ref::EnumRef, issue_435_codec::*, message_header_codec::MessageHeaderDecoder,
4-
set_ref::SetRef,
3+
set_ref::SetRef, *,
54
};
65

76
fn create_encoder(buffer: &mut Vec<u8>) -> Issue435Encoder {

rust/tests/issue_984_test.rs

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
use issue_984::{
2+
message_header_codec::MessageHeaderDecoder,
3+
simple_message_codec::{encoder::MyGroupEncoder, *},
4+
*,
5+
};
6+
7+
fn create_encoder(buffer: &mut Vec<u8>) -> SimpleMessageEncoder {
8+
let simple_msg = SimpleMessageEncoder::default().wrap(
9+
WriteBuf::new(buffer.as_mut_slice()),
10+
message_header_codec::ENCODED_LENGTH,
11+
);
12+
let mut header = simple_msg.header(0);
13+
header.parent().unwrap()
14+
}
15+
16+
#[test]
17+
fn round_trip() -> SbeResult<()> {
18+
// encode...
19+
let mut buffer = vec![0u8; 256];
20+
let mut simple_msg_encoder = create_encoder(&mut buffer);
21+
simple_msg_encoder.id(1985);
22+
23+
let mut my_grp_encoder = simple_msg_encoder.my_group_encoder(1, MyGroupEncoder::default());
24+
my_grp_encoder.advance()?;
25+
my_grp_encoder.f1(&[1, 2, 3, 4]);
26+
my_grp_encoder.f2(&[1, 2, 3, 4, 5]);
27+
my_grp_encoder.f3(&[1, 2, 3, 4, 5, 6]);
28+
29+
// decode...
30+
let buf = ReadBuf::new(buffer.as_slice());
31+
let header = MessageHeaderDecoder::default().wrap(buf, 0);
32+
assert_eq!(SBE_BLOCK_LENGTH, header.block_length());
33+
assert_eq!(SBE_SCHEMA_VERSION, header.version());
34+
assert_eq!(SBE_TEMPLATE_ID, header.template_id());
35+
assert_eq!(SBE_SCHEMA_ID, header.schema_id());
36+
37+
let simple_msg_decoder = SimpleMessageDecoder::default().header(header);
38+
assert_eq!(1985, simple_msg_decoder.id());
39+
let mut grp_decoder = simple_msg_decoder.my_group_decoder();
40+
assert_eq!(1, grp_decoder.count());
41+
grp_decoder.advance()?;
42+
43+
assert_eq!([1, 2, 3, 4], grp_decoder.f1());
44+
assert_eq!([1, 2, 3, 4, 5], grp_decoder.f2());
45+
assert_eq!([1, 2, 3, 4, 5, 6], grp_decoder.f3());
46+
Ok(())
47+
}

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

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,19 +35,23 @@ class LibRsDef
3535
{
3636
private final RustOutputManager outputManager;
3737
private final ByteOrder byteOrder;
38+
private final String schemaVersionType;
3839

3940
/**
4041
* Create a new 'lib.rs' for the library being generated
4142
*
42-
* @param outputManager for generating the codecs to.
43-
* @param byteOrder for the Encoding.
43+
* @param outputManager for generating the codecs to.
44+
* @param byteOrder for the Encoding.
45+
* @param schemaVersionType for acting_version type
4446
*/
4547
LibRsDef(
4648
final RustOutputManager outputManager,
47-
final ByteOrder byteOrder)
49+
final ByteOrder byteOrder,
50+
final String schemaVersionType)
4851
{
4952
this.outputManager = outputManager;
5053
this.byteOrder = byteOrder;
54+
this.schemaVersionType = schemaVersionType;
5155
}
5256

5357
void generate() throws IOException
@@ -82,7 +86,7 @@ void generate() throws IOException
8286
generateEitherEnum(libRs);
8387

8488
generateEncoderTraits(libRs);
85-
generateDecoderTraits(libRs);
89+
generateDecoderTraits(schemaVersionType, libRs);
8690

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

104-
static void generateDecoderTraits(final Writer writer) throws IOException
108+
static void generateDecoderTraits(final String schemaVersionType, final Writer writer) throws IOException
105109
{
110+
indent(writer, 0, "pub trait ActingVersion {\n");
111+
indent(writer, 1, "fn acting_version(&self) -> %s;\n", schemaVersionType);
112+
indent(writer, 0, "}\n\n");
113+
106114
indent(writer, 0, "pub trait Reader<'a>: Sized {\n");
107115
indent(writer, 1, "fn get_buf(&self) -> &ReadBuf<'a>;\n");
108116
indent(writer, 0, "}\n\n");

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ void generate(
7676
}
7777
else
7878
{
79-
RustGenerator.appendImplDecoderTrait(sb, msgTypeName);
79+
RustGenerator.appendImplDecoderTrait(schemaVersionType(), sb, msgTypeName);
8080
}
8181

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

9494
RustGenerator.generateDecoderFields(sb, fields, 2);
95-
RustGenerator.generateDecoderGroups(sb, groups, 2, this);
95+
RustGenerator.generateDecoderGroups(schemaVersionType(), sb, groups, 2, this);
9696
RustGenerator.generateDecoderVarData(sb, varData, 2, false);
9797
}
9898
else

0 commit comments

Comments
 (0)