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
    s2 <- {
      import formats.string.utf8
  } yield (s1, s2)

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

Reading the exported strings results in:

// A C-like string
// süß