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,
  ))
}
Search Document