Turn key=value lines into a lookup map.

key-value Each `key=value` line is split at the first `=` and stored in a map. Later code looks up a value by its key with a safe default.

Parsing Key-Value Text

lookup
KeyValue.scala
Replay: real traced execution (multi-file project)
object Main {
  def main(args: Array[String]): Unit = {
    val lookup = "host"
    val text = "host=local\nport=8080\nuser=ann"
    val lines = text.split("\n").toList
    var config = Map[String, String]()
    for (line <- lines) {
      val eq = line.indexOf("=")
      val k = line.substring(0, eq)
      val v = line.substring(eq + 1)
      config = config + (k -> v)
    }
    val value = config.getOrElse(lookup, "?")

    println("size=" + config.size)
    println("value=" + value)
  }
}
object Main {
  def main(args: Array[String]): Unit = {
    val lookup = "port"
    val text = "host=local\nport=8080\nuser=ann"
    val lines = text.split("\n").toList
    var config = Map[String, String]()
    for (line <- lines) {
      val eq = line.indexOf("=")
      val k = line.substring(0, eq)
      val v = line.substring(eq + 1)
      config = config + (k -> v)
    }
    val value = config.getOrElse(lookup, "?")

    println("size=" + config.size)
    println("value=" + value)
  }
}
object Main {
  def main(args: Array[String]): Unit = {
    val lookup = "user"
    val text = "host=local\nport=8080\nuser=ann"
    val lines = text.split("\n").toList
    var config = Map[String, String]()
    for (line <- lines) {
      val eq = line.indexOf("=")
      val k = line.substring(0, eq)
      val v = line.substring(eq + 1)
      config = config + (k -> v)
    }
    val value = config.getOrElse(lookup, "?")

    println("size=" + config.size)
    println("value=" + value)
  }
}
  1. lookup ← host, text ← host=local port=8080 user=ann, lines ← List(host=local, port=8080, user=ann)

    1object Main {2  def main(args: Array[String]): Unit = {3    val lookup→ host = "host" //@lookup="port", "user"4    val text→ host=local
    port=8080
    user=ann = "host=local\nport=8080\nuser=ann"5    val lines→ List(host=local, port=8080, user=ann) = texthost=local
    port=8080
    user=ann.split("\n").toList6    var config→ Map() = Map[String, String]()7    for (line <- lines) {8      val eq = line.indexOf("=")
  2. eq ← 4, k ← host, v ← local, config ← Map(host -> local)

    pass 1 of 3
    6var config = Map[String, String]()7for (linehost=local <- linesList(host=local, port=8080, user=ann)) {8  val eq→ 4 = linehost=local.indexOf("=")9  val k→ host = linehost=local.substring(0, eq4)10  val v→ local = linehost=local.substring(eq4 + 1)11  config→ Map(host -> local) = config + (khost -> vlocal)12}13val value = config.getOrElse(lookup, "?")
    All 3 passes — pass 1 is the card above
    passlineeqkvconfig
    1host=local4hostlocalMap() Map(host -> local)
    2port=80804port8080Map(host -> local) Map(host -> local, port -> 8080)
    3user=ann4userannMap(host -> local, port -> 8080) Map(host -> local, port -> 8080, user -> ann)
  3. value ← local

    12    }13    val value→ local = configMap(host -> local, port -> 8080, user -> ann).getOrElse(lookuphost, "?")1415    println("size=" + config.size3)16    println("value=" + valuelocal)17  }18}
    outputsize=3
    value=local
  1. lookup ← port, text ← host=local port=8080 user=ann, lines ← List(host=local, port=8080, user=ann)

    1object Main {2  def main(args: Array[String]): Unit = {3    val lookup→ port = "port"4    val text→ host=local
    port=8080
    user=ann = "host=local\nport=8080\nuser=ann"5    val lines→ List(host=local, port=8080, user=ann) = texthost=local
    port=8080
    user=ann.split("\n").toList6    var config→ Map() = Map[String, String]()7    for (line <- lines) {8      val eq = line.indexOf("=")
  2. eq ← 4, k ← host, v ← local, config ← Map(host -> local)

    pass 1 of 3
    6var config = Map[String, String]()7for (linehost=local <- linesList(host=local, port=8080, user=ann)) {8  val eq→ 4 = linehost=local.indexOf("=")9  val k→ host = linehost=local.substring(0, eq4)10  val v→ local = linehost=local.substring(eq4 + 1)11  config→ Map(host -> local) = config + (khost -> vlocal)12}13val value = config.getOrElse(lookup, "?")
    All 3 passes — pass 1 is the card above
    passlineeqkvconfig
    1host=local4hostlocalMap() Map(host -> local)
    2port=80804port8080Map(host -> local) Map(host -> local, port -> 8080)
    3user=ann4userannMap(host -> local, port -> 8080) Map(host -> local, port -> 8080, user -> ann)
  3. value ← 8080

    12    }13    val value→ 8080 = configMap(host -> local, port -> 8080, user -> ann).getOrElse(lookupport, "?")1415    println("size=" + config.size3)16    println("value=" + value8080)17  }18}
    outputsize=3
    value=8080
  1. lookup ← user, text ← host=local port=8080 user=ann, lines ← List(host=local, port=8080, user=ann)

    1object Main {2  def main(args: Array[String]): Unit = {3    val lookup→ user = "user"4    val text→ host=local
    port=8080
    user=ann = "host=local\nport=8080\nuser=ann"5    val lines→ List(host=local, port=8080, user=ann) = texthost=local
    port=8080
    user=ann.split("\n").toList6    var config→ Map() = Map[String, String]()7    for (line <- lines) {8      val eq = line.indexOf("=")
  2. eq ← 4, k ← host, v ← local, config ← Map(host -> local)

    pass 1 of 3
    6var config = Map[String, String]()7for (linehost=local <- linesList(host=local, port=8080, user=ann)) {8  val eq→ 4 = linehost=local.indexOf("=")9  val k→ host = linehost=local.substring(0, eq4)10  val v→ local = linehost=local.substring(eq4 + 1)11  config→ Map(host -> local) = config + (khost -> vlocal)12}13val value = config.getOrElse(lookup, "?")
    All 3 passes — pass 1 is the card above
    passlineeqkvconfig
    1host=local4hostlocalMap() Map(host -> local)
    2port=80804port8080Map(host -> local) Map(host -> local, port -> 8080)
    3user=ann4userannMap(host -> local, port -> 8080) Map(host -> local, port -> 8080, user -> ann)
  3. value ← ann

    12    }13    val value→ ann = configMap(host -> local, port -> 8080, user -> ann).getOrElse(lookupuser, "?")1415    println("size=" + config.size3)16    println("value=" + valueann)17  }18}
    outputsize=3
    value=ann