WebAssembly only has value integer types. However, providing a correct reader, one can interpret an integer as the address of a complex object in memory and convert it back to scala when exported. By default, Swam provides such readers for strings, either C-like or UTF-8 encoded strings. Let’s assume we have a WebAssembly module that exports two strings

import swam._
import text._
import runtime._
import cats.effect._
import java.nio.file.Paths

val tcompiler = Compiler[IO]

val engine = Engine[IO]

val strings =
  for {
    engine <- engine
    tcompiler <- tcompiler
    m <- engine.compile(tcompiler.stream(Paths.get("string.wat"), true))
    i <- m.instantiate
    s1 <- {
      import formats.string.cstring
      i.exports.typed.global[String]("c-like")
    }
    s2 <- {
      import formats.string.utf8
      i.exports.typed.global[String]("utf8")
    }
  } yield (s1, s2)

val (s1, s2) = strings.unsafeRunSync()

Reading the exported strings results in:

println(s1)
// A C-like string
println(s2)
// süß