Skip to content

Commit 4547fe6

Browse files
mwardMichael Ward
andauthored
[Rust] codegen of primitive enums now implement 'From' instead of 'Into' (#1029)
* [Rust] updated LibRsDef.generate() to add "#![allow(clippy::all)]" * [Rust] generating 'From<ENUM> for PRIMITIVE' instead of 'Into<PRIMITIVE> for ENUM' to satisfy 'from_over_into' lint * [Rust] removed unused method parameter * fixed formatting --------- Co-authored-by: Michael Ward <mward@drw.com>
1 parent 8af808c commit 4547fe6

File tree

2 files changed

+15
-14
lines changed

2 files changed

+15
-14
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ void generate(final Ir ir) throws IOException
6060
try (Writer libRs = outputManager.createOutput("lib"))
6161
{
6262
indent(libRs, 0, "#![forbid(unsafe_code)]\n");
63-
indent(libRs, 0, "#![allow(clippy::upper_case_acronyms)]\n");
63+
indent(libRs, 0, "#![allow(clippy::all)]\n");
6464
indent(libRs, 0, "#![allow(non_camel_case_types)]\n\n");
6565
indent(libRs, 0, "#![allow(ambiguous_glob_reexports)]\n\n");
6666
indent(libRs, 0, "use ::core::{convert::TryInto};\n\n");

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

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1265,19 +1265,19 @@ private static void generateEnum(
12651265
indent(writer, 0, "}\n");
12661266

12671267
// From impl
1268-
generateFromImplForEnum(enumRustName, primitiveType, messageBody, writer);
1268+
generateFromPrimitiveForEnum(enumRustName, primitiveType, messageBody, writer);
12691269

12701270
// Into impl
1271-
generateIntoImplForEnum(enumRustName, primitiveType, messageBody, writer);
1271+
generateFromEnumForPrimitive(enumRustName, primitiveType, messageBody, writer);
12721272

12731273
// FromStr impl
1274-
generateFromStrImplForEnum(enumRustName, primitiveType, messageBody, writer);
1274+
generateFromStrImplForEnum(enumRustName, messageBody, writer);
12751275

12761276
// Display impl
12771277
generateDisplayImplForEnum(enumRustName, primitiveType, messageBody, writer);
12781278
}
12791279

1280-
private static void generateFromImplForEnum(
1280+
private static void generateFromPrimitiveForEnum(
12811281
final String enumRustName,
12821282
final String primitiveType,
12831283
final List<Token> messageBody,
@@ -1302,27 +1302,29 @@ private static void generateFromImplForEnum(
13021302
indent(writer, 0, "}\n");
13031303
}
13041304

1305-
private static void generateIntoImplForEnum(
1305+
private static void generateFromEnumForPrimitive(
13061306
final String enumRustName,
13071307
final String primitiveType,
13081308
final List<Token> messageBody,
13091309
final Appendable writer) throws IOException
13101310
{
1311-
indent(writer, 0, "impl Into<%s> for %s {\n", primitiveType, enumRustName);
1311+
indent(writer, 0, "impl From<%s> for %s {\n", enumRustName, primitiveType);
13121312
indent(writer, 1, "#[inline]\n");
1313-
indent(writer, 1, "fn into(self) -> %s {\n", primitiveType);
1314-
indent(writer, 2, "match self {\n");
1313+
indent(writer, 1, "fn from(v: %s) -> Self {\n", enumRustName);
1314+
indent(writer, 2, "match v {\n");
1315+
13151316
for (final Token token : messageBody)
13161317
{
13171318
final Encoding encoding = token.encoding();
13181319
final String literal = generateRustLiteral(encoding.primitiveType(), encoding.constValue().toString());
1319-
indent(writer, 3, "Self::%s => %s, \n", token.name(), literal);
1320+
indent(writer, 3, "%s::%s => %s, \n", enumRustName, token.name(), literal);
13201321
}
1322+
13211323
{
13221324
final Encoding encoding = messageBody.get(0).encoding();
13231325
final CharSequence nullVal = generateRustLiteral(encoding.primitiveType(),
13241326
encoding.applicableNullValue().toString());
1325-
indent(writer, 3, "Self::NullVal => %s,\n", nullVal);
1327+
indent(writer, 3, "%s::NullVal => %s,\n", enumRustName, nullVal);
13261328
}
13271329
indent(writer, 2, "}\n");
13281330
indent(writer, 1, "}\n");
@@ -1331,7 +1333,6 @@ private static void generateIntoImplForEnum(
13311333

13321334
private static void generateFromStrImplForEnum(
13331335
final String enumRustName,
1334-
final String primitiveType,
13351336
final List<Token> messageBody,
13361337
final Appendable writer) throws IOException
13371338
{
@@ -1342,10 +1343,10 @@ private static void generateFromStrImplForEnum(
13421343
indent(writer, 2, "match v {\n");
13431344
for (final Token token : messageBody)
13441345
{
1345-
indent(writer, 3, "\"%1$s\" => core::result::Result::Ok(Self::%1$s), \n", token.name());
1346+
indent(writer, 3, "\"%1$s\" => Ok(Self::%1$s), \n", token.name());
13461347
}
13471348
// default => NullVal
1348-
indent(writer, 3, "_ => core::result::Result::Ok(Self::NullVal),\n");
1349+
indent(writer, 3, "_ => Ok(Self::NullVal),\n");
13491350
indent(writer, 2, "}\n");
13501351
indent(writer, 1, "}\n");
13511352
indent(writer, 0, "}\n");

0 commit comments

Comments
 (0)