Skip to content

Commit 680e28f

Browse files
mwardMichael Ward
andauthored
[Rust] fixed rust codegen to support multiple schema file with same package (#877)
Co-authored-by: Michael Ward <mward@drw.com>
1 parent 0bfe5d7 commit 680e28f

File tree

12 files changed

+101
-127
lines changed

12 files changed

+101
-127
lines changed

rust/benches/car_benchmark.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ fn encode(state: &mut State) -> SbeResult<usize> {
2828
let mut acceleration = AccelerationEncoder::default();
2929
let mut extras = OptionalExtras::default();
3030

31-
car = car.wrap(WriteBuf::new(buffer), message_header::ENCODED_LENGTH);
31+
car = car.wrap(WriteBuf::new(buffer), message_header_codec::ENCODED_LENGTH);
3232
car = car.header(0).parent()?;
3333

3434
car.code(Model::A);

rust/benches/md_benchmark.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ fn encode_md(state: &mut State) -> SbeResult<usize> {
2222
let mut market_data = MarketDataIncrementalRefreshTradesEncoder::default();
2323
let mut md_inc_grp = MdIncGrpEncoder::default();
2424

25-
market_data = market_data.wrap(WriteBuf::new(buffer), message_header::ENCODED_LENGTH);
25+
market_data = market_data.wrap(WriteBuf::new(buffer), message_header_codec::ENCODED_LENGTH);
2626
market_data = market_data.header(0).parent()?;
2727

2828
market_data.transact_time(1234);

rust/tests/baseline_test.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ fn decode_car_and_assert_expected_content(buffer: &[u8]) -> SbeResult<()> {
3333

3434
let buf = ReadBuf::new(buffer);
3535
let header = MessageHeaderDecoder::default().wrap(buf, 0);
36-
assert_eq!(car::SBE_TEMPLATE_ID, header.template_id());
36+
assert_eq!(car_codec::SBE_TEMPLATE_ID, header.template_id());
3737
car = car.header(header);
3838

3939
// Car...
@@ -167,7 +167,7 @@ fn encode_car_from_scratch() -> SbeResult<(usize, Vec<u8>)> {
167167

168168
car = car.wrap(
169169
WriteBuf::new(buffer.as_mut_slice()),
170-
message_header::ENCODED_LENGTH,
170+
message_header_codec::ENCODED_LENGTH,
171171
);
172172
car = car.header(0).parent()?;
173173

rust/tests/big_endian_test.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ fn decode_car_and_assert_expected_content(buffer: &[u8]) -> SbeResult<()> {
3030

3131
let buf = ReadBuf::new(buffer);
3232
let header = MessageHeaderDecoder::default().wrap(buf, 0);
33-
assert_eq!(car::SBE_TEMPLATE_ID, header.template_id());
33+
assert_eq!(car_codec::SBE_TEMPLATE_ID, header.template_id());
3434
car = car.header(header);
3535

3636
// Car...
@@ -161,7 +161,7 @@ fn encode_car_from_scratch() -> SbeResult<(usize, Vec<u8>)> {
161161

162162
car = car.wrap(
163163
WriteBuf::new(buffer.as_mut_slice()),
164-
message_header::ENCODED_LENGTH,
164+
message_header_codec::ENCODED_LENGTH,
165165
);
166166
car = car.header(0).parent()?;
167167

rust/tests/extension_test.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ fn decode_car_and_assert_expected_content(buffer: &[u8]) -> SbeResult<()> {
3232

3333
let buf = ReadBuf::new(buffer);
3434
let header = MessageHeaderDecoder::default().wrap(buf, 0);
35-
assert_eq!(car::SBE_TEMPLATE_ID, header.template_id());
35+
assert_eq!(car_codec::SBE_TEMPLATE_ID, header.template_id());
3636
car = car.header(header);
3737

3838
// Car...
@@ -168,7 +168,7 @@ fn encode_car_from_scratch() -> SbeResult<(usize, Vec<u8>)> {
168168

169169
car = car.wrap(
170170
WriteBuf::new(buffer.as_mut_slice()),
171-
message_header::ENCODED_LENGTH,
171+
message_header_codec::ENCODED_LENGTH,
172172
);
173173
car = car.header(0).parent()?;
174174

rust/tests/issue_435_test.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use ::issue_435::*;
33
fn create_encoder(buffer: &mut Vec<u8>) -> Issue435Encoder {
44
let issue_435 = Issue435Encoder::default().wrap(
55
WriteBuf::new(buffer.as_mut_slice()),
6-
message_header::ENCODED_LENGTH,
6+
message_header_codec::ENCODED_LENGTH,
77
);
88
let mut header = issue_435.header(0);
99
header.s(*SetRef::default().set_one(true));
@@ -12,9 +12,9 @@ fn create_encoder(buffer: &mut Vec<u8>) -> Issue435Encoder {
1212

1313
#[test]
1414
fn issue_435_ref_test() -> SbeResult<()> {
15-
assert_eq!(9, message_header::ENCODED_LENGTH);
16-
assert_eq!(1, issue_435::SBE_BLOCK_LENGTH);
17-
assert_eq!(0, issue_435::SBE_SCHEMA_VERSION);
15+
assert_eq!(9, message_header_codec::ENCODED_LENGTH);
16+
assert_eq!(1, issue_435_codec::SBE_BLOCK_LENGTH);
17+
assert_eq!(0, issue_435_codec::SBE_SCHEMA_VERSION);
1818

1919
// encode...
2020
let mut buffer = vec![0u8; 256];
@@ -24,10 +24,10 @@ fn issue_435_ref_test() -> SbeResult<()> {
2424
// decode...
2525
let buf = ReadBuf::new(buffer.as_slice());
2626
let header = MessageHeaderDecoder::default().wrap(buf, 0);
27-
assert_eq!(issue_435::SBE_BLOCK_LENGTH, header.block_length());
28-
assert_eq!(issue_435::SBE_SCHEMA_VERSION, header.version());
29-
assert_eq!(issue_435::SBE_TEMPLATE_ID, header.template_id());
30-
assert_eq!(issue_435::SBE_SCHEMA_ID, header.schema_id());
27+
assert_eq!(issue_435_codec::SBE_BLOCK_LENGTH, header.block_length());
28+
assert_eq!(issue_435_codec::SBE_SCHEMA_VERSION, header.version());
29+
assert_eq!(issue_435_codec::SBE_TEMPLATE_ID, header.template_id());
30+
assert_eq!(issue_435_codec::SBE_SCHEMA_ID, header.schema_id());
3131
assert_eq!(*SetRef::default().set_one(true), header.s());
3232

3333
let decoder = Issue435Decoder::default().header(header);

sbe-tool/src/main/java/uk/co/real_logic/sbe/SbeTool.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ public class SbeTool
164164
* Specifies token that should be appended to keywords to avoid compilation errors.
165165
* <p>
166166
* If none is supplied then use of keywords results in an error during schema parsing. The
167-
* underscore character is a good example fo a token to use.
167+
* underscore character is a good example of a token to use.
168168
*/
169169
public static final String KEYWORD_APPEND_TOKEN = "sbe.keyword.append.token";
170170

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

Lines changed: 16 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -15,17 +15,12 @@
1515
*/
1616
package uk.co.real_logic.sbe.generation.rust;
1717

18-
import org.agrona.generation.OutputManager;
19-
import uk.co.real_logic.sbe.generation.rust.RustGenerator.CodecType;
20-
2118
import java.io.IOException;
2219
import java.io.Writer;
2320
import java.nio.ByteOrder;
21+
import java.nio.file.Files;
2422
import java.util.ArrayList;
25-
import java.util.HashSet;
26-
import java.util.LinkedHashMap;
2723
import java.util.LinkedHashSet;
28-
import java.util.Map;
2924

3025
import static java.nio.ByteOrder.LITTLE_ENDIAN;
3126
import static uk.co.real_logic.sbe.generation.rust.RustGenerator.*;
@@ -36,11 +31,7 @@
3631
*/
3732
class LibRsDef
3833
{
39-
private final LinkedHashMap<String, HashSet<CodecType>> modules = new LinkedHashMap<>();
40-
private final ArrayList<String> enumDefs = new ArrayList<>();
41-
private final ArrayList<String> bitSetDefs = new ArrayList<>();
42-
43-
private final OutputManager outputManager;
34+
private final RustOutputManager outputManager;
4435
private final ByteOrder byteOrder;
4536

4637
/**
@@ -50,60 +41,42 @@ class LibRsDef
5041
* @param byteOrder for the Encoding.
5142
*/
5243
LibRsDef(
53-
final OutputManager outputManager,
44+
final RustOutputManager outputManager,
5445
final ByteOrder byteOrder)
5546
{
5647
this.outputManager = outputManager;
5748
this.byteOrder = byteOrder;
5849
}
5950

60-
void addMod(final String modName, final CodecType codecType)
61-
{
62-
modules.computeIfAbsent(modName, __ -> new HashSet<>()).add(codecType);
63-
}
64-
65-
void addEnum(final String enumDef)
66-
{
67-
enumDefs.add(enumDef);
68-
}
69-
70-
void addBitSet(final String bitSetDef)
71-
{
72-
bitSetDefs.add(bitSetDef);
73-
}
74-
7551
void generate() throws IOException
7652
{
7753
try (Writer libRs = outputManager.createOutput("lib"))
7854
{
7955
indent(libRs, 0, "#![forbid(unsafe_code)]\n");
8056
indent(libRs, 0, "#![allow(clippy::upper_case_acronyms)]\n");
8157
indent(libRs, 0, "#![allow(non_camel_case_types)]\n");
82-
indent(libRs, 0, "use core::{convert::TryInto};\n\n");
58+
indent(libRs, 0, "use ::core::{convert::TryInto};\n\n");
59+
60+
final ArrayList<String> modules = new ArrayList<>();
61+
Files.walk(outputManager.getSrcDirPath())
62+
.filter(Files::isRegularFile)
63+
.map(path -> path.getFileName().toString())
64+
.filter(fileName -> fileName.endsWith(".rs"))
65+
.filter(fileName -> !fileName.equals("lib.rs"))
66+
.map(fileName -> fileName.substring(0, fileName.length() - 3))
67+
.forEach(modules::add);
8368

8469
// add modules
85-
for (final String mod : modules.keySet())
70+
for (final String mod : modules)
8671
{
8772
indent(libRs, 0, "pub mod %s;\n", toLowerSnakeCase(mod));
8873
}
8974
indent(libRs, 0, "\n");
9075

9176
// add re-export of modules
92-
for (final Map.Entry<String, HashSet<CodecType>> entry : modules.entrySet())
77+
for (final String module : modules)
9378
{
94-
final String mod = entry.getKey();
95-
final HashSet<CodecType> codecTypes = entry.getValue();
96-
97-
if (codecTypes.size() == 1)
98-
{
99-
indent(libRs, 0, "pub use %s::%s::*;\n",
100-
toLowerSnakeCase(mod),
101-
toLowerSnakeCase(codecTypes.toArray()[0].toString()));
102-
}
103-
else
104-
{
105-
indent(libRs, 0, "pub use %s::{decoder::*, encoder::*};\n", toLowerSnakeCase(mod));
106-
}
79+
indent(libRs, 0, "pub use %s::*;\n", toLowerSnakeCase(module));
10780
}
10881
indent(libRs, 0, "\n");
10982

@@ -115,20 +88,6 @@ void generate() throws IOException
11588

11689
generateReadBuf(libRs, byteOrder);
11790
generateWriteBuf(libRs, byteOrder);
118-
119-
// append generated enums
120-
for (final String code : enumDefs)
121-
{
122-
libRs.append(code);
123-
indent(libRs, 0, "\n");
124-
}
125-
126-
// append generated bitSets
127-
for (final String code : bitSetDefs)
128-
{
129-
libRs.append(code);
130-
indent(libRs, 0, "\n");
131-
}
13291
}
13392
}
13493

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ void appendMessageHeaderDecoderFn(final Appendable out) throws IOException
147147
indent(out, 3, "let acting_version = header.version();\n\n");
148148
indent(out, 3, "self.wrap(\n");
149149
indent(out, 4, "header.parent().unwrap(),\n");
150-
indent(out, 4, "message_header::ENCODED_LENGTH,\n");
150+
indent(out, 4, "message_header_codec::ENCODED_LENGTH,\n");
151151
indent(out, 4, "acting_block_length,\n");
152152
indent(out, 4, "acting_version,\n");
153153
indent(out, 3, ")\n");

0 commit comments

Comments
 (0)