Current section

Files

Jump to
gleam_stdlib src gleam dynamic.gleam
Raw

src/gleam/dynamic.gleam

import gleam/list as list_mod
import gleam/atom
import gleam/result
// `Dynamic` data is data that we don"t know the type of yet.
// We likely get data like this from interop with Erlang, or from
// IO with the outside world.
//
pub external type Dynamic;
// Convert any Gleam data into `Dynamic` data.
//
pub external fn from(a) -> Dynamic = "gleam_stdlib" "identity";
// Unsafely cast a Dynamic value into any other type.
//
// This is an escape hatch for the type system that may be useful when wrapping
// native Erlang APIs. It is to be used as a last measure only.
//
pub external fn unsafe_coerce(a) -> b = "gleam_stdlib" "identity";
pub external fn string(from: Dynamic) -> Result(String, String)
= "gleam_stdlib" "decode_string"
pub external fn int(from: Dynamic) -> Result(Int, String)
= "gleam_stdlib" "decode_int"
pub external fn float(from: Dynamic) -> Result(Float, String)
= "gleam_stdlib" "decode_float"
pub external fn atom(from: Dynamic) -> Result(atom.Atom, String)
= "gleam_stdlib" "decode_atom"
pub external fn bool(from: Dynamic) -> Result(Bool, String)
= "gleam_stdlib" "decode_bool"
pub external fn thunk(from: Dynamic) -> Result(fn() -> Dynamic, String)
= "gleam_stdlib" "decode_thunk"
external fn list_dynamic(from: Dynamic) -> Result(List(Dynamic), String)
= "gleam_stdlib" "decode_list"
pub fn list(from dynamic, containing decoder_type) {
dynamic
|> list_dynamic
|> result.then(_, list_mod.traverse(_, decoder_type))
}
pub external fn field(from: Dynamic, named: a) -> Result(Dynamic, String)
= "gleam_stdlib" "decode_field"