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!
///
/// If you can avoid using this function, do!
///
pub external fn unsafe_coerce(Dynamic) -> a =
"gleam_stdlib" "identity"
/// Check to see whether a Dynamic value is a string, and return the string if
/// it is.
///
/// ## Examples
///
/// > string(from("Hello"))
/// Ok("Hello")
///
/// > string(from(123))
/// Error("Expected a String, got `123`")
///
pub external fn string(from: Dynamic) -> Result(String, String) =
"gleam_stdlib" "decode_string"
/// Check to see whether a Dynamic value is an int, and return the int if it
/// is.
///
/// ## Examples
///
/// > int(from(123))
/// Ok(123)
///
/// > int(from("Hello"))
/// Error("Expected an Int, got `\"Hello World\"`")
///
pub external fn int(from: Dynamic) -> Result(Int, String) =
"gleam_stdlib" "decode_int"
/// Check to see whether a Dynamic value is an float, and return the float if
/// it is.
///
/// ## Examples
///
/// > float(from(2.0))
/// Ok(2.0)
///
/// > float(from(123))
/// Error("Expected a Float, got `123`")
///
pub external fn float(from: Dynamic) -> Result(Float, String) =
"gleam_stdlib" "decode_float"
/// Check to see whether a Dynamic value is an atom, and return the atom if
/// it is.
///
/// ## Examples
///
/// > import gleam/atom
/// > atom(from(atom.create_from_string("hello")))
/// OK("hello")
///
/// > atom(from(123))
/// Error("Expected an Atom, got `123`")
///
pub external fn atom(from: Dynamic) -> Result(atom.Atom, String) =
"gleam_stdlib" "decode_atom"
/// Check to see whether a Dynamic value is an bool, and return the bool if
/// it is.
///
/// ## Examples
///
/// > bool(from(True))
/// Ok(True)
///
/// > bool(from(123))
/// Error("Expected a Bool, got `123`")
///
pub external fn bool(from: Dynamic) -> Result(Bool, String) =
"gleam_stdlib" "decode_bool"
/// Check to see whether a Dynamic value is a function that takes no arguments,
/// and return the function if it is.
///
/// ## Examples
///
/// > import gleam/result
/// > let f = fn() { 1 }
/// > thunk(from(f)) |> result.is_ok
/// True
///
/// > thunk(from(123))
/// Error("Expected a zero arity function, got `123`")
///
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"
/// Check to see whether a Dynamic value is a list, and return the list if it
/// is.
///
/// ## Examples
///
/// > list(from(["a", "b", "c"]), string)
/// Ok(["a", "b", "c"])
///
/// > list(from([1, 2, 3]), string)
/// Error("Expected an Int, got a binary")
///
/// > list(from("ok"), string)
/// Error("Expected a List, got a binary")
///
pub fn list(
from dynamic: Dynamic,
containing decoder_type: fn(Dynamic) -> Result(inner, String),
) -> Result(List(inner), String) {
dynamic
|> list_dynamic
|> result.then(list_mod.traverse(_, decoder_type))
}
/// Check to see if a Dynamic value is a map with a specific field, and return
/// the value of the field if it is.
///
/// This will not succeed on a record.
///
/// ## Examples
///
/// > import gleam/map
/// > field(from(map.new("Hello", "World")), "Hello")
/// Ok(Dynamic)
///
/// > field(from(123), "Hello")
/// Error("Expected a map with key `\"Hello\"`, got an Int")
///
pub external fn field(from: Dynamic, named: a) -> Result(Dynamic, String) =
"gleam_stdlib" "decode_field"
/// Check to see if the Dynamic value is a tuple large enough to have a certain
/// index, and return the value of that index if it is.
///
/// ## Examples
///
/// > element(from(tuple(1, 2)), 0)
/// Ok(Dynamic)
///
/// > element(from(tuple(1, 2)), 2)
/// Error("Expected a tuple of at least 3 size, got a tuple of 2 size")
///
/// > element(from(""), 2)
/// Error("Expected a Tuple, got a binary")
///
pub external fn element(
from: Dynamic,
position: Int,
) -> Result(Dynamic, String) =
"gleam_stdlib" "decode_element"