Skip to content

Commit ffca8d7

Browse files
committed
Rust: generate FromStrRadix::from_str_radix for non-base-10 .to_i conversions
FromStrRadix is a custom trait from not yet exist Rust runtime library
1 parent 239c54e commit ffca8d7

File tree

3 files changed

+11
-7
lines changed

3 files changed

+11
-7
lines changed

jvm/src/test/scala/io/kaitai/struct/translators/TranslatorSpec.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1084,7 +1084,7 @@ class TranslatorSpec extends AnyFunSpec {
10841084
PHPCompiler -> new PHPTranslator(tp, RuntimeConfig()),
10851085
PythonCompiler -> new PythonTranslator(tp, new ImportList(), RuntimeConfig()),
10861086
RubyCompiler -> new RubyTranslator(tp),
1087-
RustCompiler -> new RustTranslator(tp, RuntimeConfig()),
1087+
RustCompiler -> new RustTranslator(tp, new ImportList()),
10881088
)
10891089

10901090
langs.foreach { case (langObj, tr) =>

shared/src/main/scala/io/kaitai/struct/languages/RustCompiler.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ class RustCompiler(typeProvider: ClassTypeProvider, config: RuntimeConfig)
2525

2626
override def innerEnums = false
2727

28-
override val translator: RustTranslator = new RustTranslator(typeProvider, config)
28+
override val translator: RustTranslator = new RustTranslator(typeProvider, importList)
2929

3030
override def universalFooter: Unit = {
3131
out.dec

shared/src/main/scala/io/kaitai/struct/translators/RustTranslator.scala

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@ import io.kaitai.struct.exprlang.Ast
55
import io.kaitai.struct.exprlang.Ast.expr
66
import io.kaitai.struct.format.{EnumSpec, Identifier}
77
import io.kaitai.struct.languages.RustCompiler
8-
import io.kaitai.struct.{RuntimeConfig, Utils}
8+
import io.kaitai.struct.{ImportList, Utils}
99

10-
class RustTranslator(provider: TypeProvider, config: RuntimeConfig) extends BaseTranslator(provider) {
10+
class RustTranslator(provider: TypeProvider, importList: ImportList) extends BaseTranslator(provider) {
1111
override def doByteArrayLiteral(arr: Seq[Byte]): String =
1212
"vec!([" + arr.map((x) =>
1313
"%0#2x".format(x & 0xff)
@@ -61,13 +61,17 @@ class RustTranslator(provider: TypeProvider, config: RuntimeConfig) extends Base
6161
override def strConcat(left: expr, right: expr, extPrec: Int) =
6262
"format!(\"{}{}\", " + translate(left) + ", " + translate(right) + ")"
6363

64-
override def strToInt(s: expr, base: expr): String =
65-
translate(base) match {
64+
// TODO: do not generate .unwrap(), generate ? instead
65+
override def strToInt(s: expr, base: expr): String = {
66+
val baseStr = translate(base)
67+
baseStr match {
6668
case "10" =>
6769
s"${translate(s)}.parse().unwrap()"
6870
case _ =>
69-
"panic!(\"Converting from string to int in base {} is unimplemented\", " + translate(base) + ")"
71+
importList.add("kaitai_struct::FromStrRadix")
72+
s"FromStrRadix::from_str_radix(${translate(s)}, $baseStr).unwrap()"
7073
}
74+
}
7175

7276
override def enumToInt(v: expr, et: EnumType): String =
7377
translate(v)

0 commit comments

Comments
 (0)