Packages
gleam_bson
0.26.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/generic.gleam
import gleam/list
import gleam/queue
import gleam/bit_string
pub opaque type Generic {
Generic(BitString)
}
pub fn to_string(generic: Generic) -> Result(String, Nil) {
case generic {
Generic(data) -> bit_string.to_string(data)
}
}
pub fn to_int_list(generic: Generic) -> List(Int) {
case generic {
Generic(data) -> to_int_list_internal(data, queue.new())
}
}
pub fn to_bit_string(generic: Generic) -> BitString {
case generic {
Generic(data) -> data
}
}
pub fn from_string(data: String) -> Generic {
Generic(bit_string.from_string(data))
}
pub fn from_int_list(data: List(Int)) -> Generic {
data
|> list.fold(<<>>, fn(acc, code) { bit_string.append(acc, <<code>>) })
|> Generic
}
pub fn from_bit_string(data: BitString) -> Result(Generic, Nil) {
case bit_size(data) % 8 {
0 -> Ok(Generic(data))
_ -> Error(Nil)
}
}
fn to_int_list_internal(
remaining: BitString,
storage: queue.Queue(Int),
) -> List(Int) {
let <<num:8, remaining:binary>> = remaining
let new_storage = queue.push_back(storage, num)
case bit_string.byte_size(remaining) == 0 {
True -> queue.to_list(new_storage)
False -> to_int_list_internal(remaining, new_storage)
}
}
@external(erlang, "erlang", "bit_size")
fn bit_size(a: BitString) -> Int