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 myapp.{Cat}
import gleam/list
import bson/types
import bson.{encode}
import bson/object_id.{from_string}

fn cat_to_bson(cat: Cat) -> Result(BitString, Nil) {
  case from_string(cat.id) {
    Ok(id) ->
      Ok(encode([
        #("id", types.ObjectId(id)),
        #("name", types.Str(cat.name)),
        #("lives", types.Integer(cat.lives)),
        #(
          "nicknames",
          types.Array(
            cat.nicknames
            |> list.map(fn(n) { types.Str(n) }),
          ),
        ),
      ]))

    Error(Nil) -> Error(Nil)
  }
}

Decoding

import myapp.{Cat}
import gleam/list
import bson/types
import bson.{decode}
import bson/object_id.{to_string}

fn cat_from_bson(data: BitString) -> Result(Cat, Nil) {
  case decode(data) {
    Ok(doc) -> {
      let [
        #("id", types.ObjectId(id)),
        #("name", types.Str(name)),
        #("lives", types.Integer(lives)),
        #("nicknames", types.Array(nicknames)),
      ] = doc

      Ok(Cat(
        id: id
        |> to_string,
        name: name,
        lives: lives,
        nicknames: nicknames
        |> list.map(fn(n) {
          case n {
            types.Str(n) -> n
          }
        }),
      ))
    }

    Error(Nil) -> Error(Nil)
  }
}