Pudu programming language
Menu
Package

@chrismichaelps / pudu-lang-environment

Environment files for Pudu: load .env variables safely with layered files, discovery, expansion, typed reads, and secrets kept out of every message

0.1.0Apache-2.01

InstallClose

Layers.pudu

Pudu40 lines1.5 KB

GitHub ↗
1/** @Domain.Layers.Module — which assignment of a key is kept */2module PuduLangEnvironment.Domain.Layers34/** @Domain.Layers.Entry — one assignment, in file order */5export type Entry = { key: Str, value: Str }67/** @Domain.Layers.Settled — loaded values settled over the process */8export type Settled = { values: Map[Str, Str], applied: Array[Str] }910/// The known values with `key` set to `value` when overwriting or when the key is new.11export fn keep(known: &Map[Str, Str], key: Str, value: Str, overwrite: Bool) -> Map[Str, Str] {12  if overwrite || !known.containsKey(key) { known.insert(key, value) } else { *known }13}1415/// Every entry of every layer kept in order by the overwrite rule.16export fn merge(layers: &Array[Array[Entry]], overwrite: Bool) -> Map[Str, Str] {17  var merged: Map[Str, Str] = mapOf([])18  for layer in layers {19    for entry in layer {20      merged = keep(&merged, entry.key, entry.value, overwrite)21    }22  }23  merged24}2526/// The process values with each loaded value stored over them when overwriting or when the process27/// value is unset or empty, and the stored keys in sorted order.28export fn settle(loaded: &Map[Str, Str], process: &Map[Str, Str], overwrite: Bool) -> Settled {29  var values = *process30  var applied: Array[Str] = []31  for pair in loaded.entries() {32    let held = process.get(pair[0])33    if overwrite || held == None || held == Some("") {34      values = values.insert(pair[0], pair[1])35      applied = applied.push(pair[0])36    }37  }38  Settled{values: values, applied: applied}39}40