Packages
gleam_bson
0.9.0
0.27.0
retired
0.26.0
retired
0.25.0
retired
0.24.0
retired
0.23.0
retired
0.22.0
retired
0.21.0
retired
0.20.0
retired
0.19.0
retired
0.18.0
retired
0.17.0
retired
0.16.0
retired
0.15.0
retired
0.14.0
retired
0.13.0
retired
0.12.0
retired
0.11.0
retired
0.10.1
retired
0.10.0
retired
0.9.0
retired
0.8.0
retired
0.7.0
retired
0.6.0
retired
0.5.0
retired
0.4.0
retired
0.3.0
retired
0.2.0
retired
0.1.0
retired
bson encoder and decoder for gleam
Retired package: Renamed - Republished as bison
Current section
Files
Jump to
Current section
Files
src/bson/binary.gleam
import gleam/list
import gleam/bit_string
external fn bit_size(BitString) -> Int =
"erlang" "bit_size"
pub opaque type Binary {
Generic(BitString)
}
pub fn to_string(binary: Binary) -> Result(String, Nil) {
case binary {
Generic(data) -> bit_string.to_string(data)
}
}
pub fn to_int_list(binary: Binary) -> List(Int) {
case binary {
Generic(data) ->
data
|> to_int_list_internal([])
}
}
pub fn to_bit_string(binary: Binary) -> BitString {
case binary {
Generic(data) -> data
}
}
pub fn from_string(data: String) -> Binary {
Generic(bit_string.from_string(data))
}
pub fn from_int_list(data: List(Int)) -> Binary {
Generic(
data
|> list.fold(
<<>>,
fn(acc, code) {
acc
|> bit_string.append(<<code>>)
},
),
)
}
pub fn from_bit_string(data: BitString) -> Result(Binary, Nil) {
case bit_size(data) % 8 {
0 -> Ok(Generic(data))
_ -> Error(Nil)
}
}
fn to_int_list_internal(remaining: BitString, storage: List(Int)) -> List(Int) {
let <<num:8, remaining:binary>> = remaining
let new_storage =
storage
|> list.append([num])
case bit_string.byte_size(remaining) == 0 {
True -> new_storage
False -> to_int_list_internal(remaining, new_storage)
}
}