gleam_bson

A bson encoder and decoder written in gleam

Quick start

gleam test # Run the tests
gleam shell # Run an Erlang shell

Installation

gleam add gleam_bson

Roadmap

Usage

Encoding

import bson/md5
import gleam/list
import bson/types
import bson.{encode}
import bson/object_id
fn cat_to_bson(cat: Cat) -> Result(BitString, Nil) {
try id = object_id.from_string(cat.id)
try checksum = md5.from_string(cat.checksum)
Ok(encode([
#("id", types.ObjectId(id)),
#("name", types.Str(cat.name)),
#("lives", types.Integer(cat.lives)),
#(
"nicknames",
types.Array(
cat.nicknames
|> list.map(types.Str),
),
),
#("checksum", types.Binary(types.MD5(checksum))),
#("name_pattern", types.Regex(#("[a-z][a-z0-9]+", "")))
]))
}

Decoding

import bson/md5
import gleam/list
import bson/types
import bson.{decode}
import bson/object_id
fn cat_from_bson(data: BitString) -> Result(Cat, Nil) {
try doc = decode(data)
let [
#("id", types.ObjectId(id)),
#("name", types.Str(name)),
#("lives", types.Integer(lives)),
#("nicknames", types.Array(nicknames)),
#("checksum", types.Binary(types.MD5(checksum))),
#("name_pattern", types.Regex(#(pattern, options)))
] = doc
Ok(Cat(
id: id
|> object_id.to_string,
name: name,
lives: lives,
nicknames: nicknames
|> list.map(fn(n) {
assert types.Str(n) = n
n
}),
checksum: checksum
|> md5.to_string,
))
}