Packages
gleam_stdlib
0.54.0
1.0.3
1.0.2
1.0.1
1.0.0
0.71.0
0.70.0
0.69.0
0.68.1
0.68.0
0.67.1
0.67.0
0.65.0
0.64.0
0.63.2
0.63.1
0.63.0
0.62.1
0.62.0
0.61.0
0.60.0
0.59.0
0.58.0
0.57.0
0.56.0
0.55.0
0.54.0
0.53.0
0.52.0
0.51.0
0.50.0
0.49.0
0.48.0
0.47.0
0.46.0
0.45.0
0.44.0
0.43.0
0.42.0
0.41.0
0.40.0
0.39.0
0.38.0
0.37.0
0.36.0
0.35.1
0.35.0
0.34.0
0.33.1
0.33.0
0.32.1
0.32.0
0.31.0
0.30.2
0.30.1
0.30.0
0.29.2
0.29.1
0.29.0
0.28.2
0.28.1
0.28.0
0.27.0
0.26.1
0.26.0
0.25.0
0.24.0
0.23.0
0.22.3
0.22.2
0.22.1
0.22.0
0.21.0
0.20.0
0.19.3
0.19.2
0.19.1
0.19.0
0.18.1
0.18.0
0.18.0-rc1
0.17.1
0.17.0
0.16.0
0.15.0
0.14.0
0.13.0
0.12.0
0.11.0
0.10.1
0.10.0
0.9.0
0.8.0
0.7.0
0.6.0
0.5.0
0.4.0
0.4.0-rc1
0.3.1
0.3.0
0.2.0
retired
A standard library for the Gleam programming language
Current section
Files
Jump to
Current section
Files
src/gleam_stdlib_decode_ffi.mjs
import { Ok, Error, List, NonEmpty, BitArray } from "./gleam.mjs";
import { default as Dict } from "./dict.mjs";
import { Some, None } from "./gleam/option.mjs";
import { classify } from "./gleam/dynamic.mjs";
import { DecodeError } from "./gleam/dynamic/decode.mjs";
export function index(data, key) {
const int = Number.isInteger(key);
// Dictionaries and dictionary-like objects can be indexed
if (data instanceof Dict || data instanceof WeakMap || data instanceof Map) {
const token = {};
const entry = data.get(key, token);
if (entry === token) return new Ok(new None());
return new Ok(new Some(entry));
}
// The first 3 elements of lists can be indexed
if ((key === 0 || key === 1 || key === 2) && data instanceof List) {
let i = 0;
for (const value of data) {
if (i === key) return new Ok(new Some(value));
i++;
}
return new Error("Indexable");
}
// Arrays and objects can be indexed
if (
(int && Array.isArray(data)) ||
(data && typeof data === "object") ||
(data && Object.getPrototypeOf(data) === Object.prototype)
) {
if (key in data) return new Ok(new Some(data[key]));
return new Ok(new None());
}
return new Error(int ? "Indexable" : "Dict");
}
export function list(data, decode, pushPath, index, emptyList) {
if (!(data instanceof List || Array.isArray(data))) {
let error = new DecodeError("List", classify(data), emptyList);
return [emptyList, List.fromArray([error])];
}
const decoded = [];
for (const element of data) {
const layer = decode(element);
const [out, errors] = layer;
if (errors instanceof NonEmpty) {
const [_, errors] = pushPath(layer, index.toString());
return [emptyList, errors];
}
decoded.push(out);
index++;
}
return [List.fromArray(decoded), emptyList];
}
export function dict(data) {
if (data instanceof Dict) {
return new Ok(data);
}
if (data instanceof Map || data instanceof WeakMap) {
return new Ok(Dict.fromMap(data));
}
if (data == null) {
return new Error("Dict");
}
if (typeof data !== "object") {
return new Error("Dict");
}
const proto = Object.getPrototypeOf(data);
if (proto === Object.prototype || proto === null) {
return new Ok(Dict.fromObject(data));
}
return new Error("Dict");
}
export function bit_array(data) {
if (data instanceof BitArray) return new Ok(data);
if (data instanceof Uint8Array) return new Ok(new BitArray(data));
return new Error(new BitArray(new Uint8Array()));
}
export function float(data) {
if (typeof data === "number") return new Ok(data);
return new Error(0.0);
}
export function int(data) {
if (Number.isInteger(data)) return new Ok(data);
return new Error(0);
}
export function string(data) {
if (typeof data === "string") return new Ok(data);
return new Error(0);
}
export function is_null(data) {
return data === null || data === undefined;
}