geam-stdlib 0.2.1

Official Gleam standard-library providers for Geam
Documentation
import gleam/dynamic
import gleam/dynamic/decode

pub fn main() {
  let data = dynamic.properties([
    #(dynamic.string("name"), dynamic.string("Ada")),
    #(
      dynamic.string("nested"),
      dynamic.properties([#(dynamic.string("count"), dynamic.int(2))]),
    ),
  ])

  let decoder = {
    use name <- decode.field("name", decode.string)
    use age <- decode.optional_field("age", 36, decode.int)
    decode.success(#(name, age))
  }
  assert decode.run(data, decoder) == Ok(#("Ada", 36))
  let subfield_decoder = {
    use count <- decode.subfield(["nested", "count"], decode.int)
    decode.success(count)
  }
  assert decode.run(data, subfield_decoder) == Ok(2)
  assert decode.run(data, decode.at(["nested", "count"], decode.int)) == Ok(2)
  assert decode.run(data, decode.optionally_at(["nested", "missing"], 7, decode.int)) ==
    Ok(7)
  assert decode.run(data, decode.at(["missing"], decode.int)) == Error([
    decode.DecodeError(expected: "Field", found: "Nothing", path: ["missing"]),
  ])

  let list_data = dynamic.list([
    dynamic.int(0),
    dynamic.int(1),
    dynamic.int(2),
    dynamic.int(3),
    dynamic.int(4),
    dynamic.int(5),
    dynamic.int(6),
    dynamic.int(7),
    dynamic.int(8),
  ])
  let array_data = dynamic.array([
    dynamic.int(0),
    dynamic.int(1),
    dynamic.int(2),
    dynamic.int(3),
    dynamic.int(4),
    dynamic.int(5),
    dynamic.int(6),
    dynamic.int(7),
    dynamic.int(8),
  ])
  assert decode.run(list_data, decode.at([7], decode.int)) == Ok(7)
  assert decode.run(list_data, decode.at([8], decode.int)) == Error([
    decode.DecodeError(expected: "Indexable", found: "List", path: []),
  ])
  assert decode.run(array_data, decode.at([8], decode.int)) == Ok(8)
  assert decode.run(array_data, decode.optionally_at([20], 20, decode.int)) == Ok(20)

  #("Ada", data)
}

// @geam:expect #("Ada", dict.from_list([#("name", "Ada"), #("nested", dict.from_list([#("count", 2)]))]))