env_vars.pony

use "collections"

primitive EnvVars
  fun apply(
    envs: (Array[String] box | None),
    prefix: String = "",
    squash: Bool = false):
    Map[String, String] val
  =>
    """
    Turns an array of strings that look like environment variables, ie.
    key=value, into a map of string to string. Can optionally filter for
    keys matching a 'prefix', and will squash resulting keys to lowercase
    iff 'squash' is true.

    So:
      `<PREFIX><KEY>=<VALUE>`
    becomes:
      `{KEY, VALUE}` or `{key, VALUE}`
    """
    let envsmap = recover Map[String, String]() end
    match envs
    | let envsarr: Array[String] box =>
      let prelen = prefix.size().isize()
      for e in envsarr.values() do
        let eqpos = try e.find("=")? else ISize.max_value() end
        let ek: String val = e.substring(0, eqpos)
        let ev: String val = e.substring(eqpos + 1)
        if (prelen == 0) or ek.at(prefix, 0) then
          if squash then
            envsmap.update(ek.substring(prelen).lower(), ev)
          else
            envsmap.update(ek.substring(prelen), ev)
          end
        end
      end
    end
    envsmap