Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
57 changes: 37 additions & 20 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,43 +17,60 @@ Please check out the encode/decode tests.

## Encode
```gleam
import gbor
import gbor as g
import gbor/encode

import gleam/list

type Cat {
Cat(name: String, lives: Int, nicknames: List(String))
}

fn cat_encoder(cat: Cat) -> BitArray {
encode.map([
#(encode.string("name"), encode.string(cat.name)),
#(encode.string("lives"), encode.int(cat.lives)),
#(
encode.string("nicknames"),
encode.array(list.map(cat.nicknames, encode.string)),
),
fn cat_encoder(cat: Cat) -> Result(BitArray, encode.EncodeError) {
g.CBMap([
#(g.CBString("name"), g.CBString(cat.name)),
#(g.CBString("lives"), g.CBInt(cat.lives)),
#(g.CBString("nicknames"), g.CBArray(list.map(cat.nicknames, g.CBString))),
])
|> encode.to_bit_array
}

pub fn main() {
let assert Ok(bin) =
Cat("Fluffy", 9, ["Fluff", "Fluffers"])
|> cat_encoder
}
```

## Decode
```gleam
import gbor
import gleam/dynamic/decode as dy_decode
import gbor/decode as gbor_decode
import gleam/bit_array
import gleam/dynamic/decode as gdd

pub type Cat {
Cat(name: String, lives: Int, nicknames: List(String))
}

fn decode_cat(data: BitArray) -> Result(Cat, List(dy_decode.DecodeError)) {
fn decode_cat(data: BitArray) -> Result(Cat, List(gdd.DecodeError)) {
let cat_decoder = {
use name <- dy_decode.field("name", dy_decode.string)
use lives <- dy_decode.field("lives", dy_decode.int)
use nicknames <- dy_decode.field(
"nicknames",
dy_decode.list(dy_decode.string),
)
dy_decode.success(Cat(name:, lives:, nicknames:))
use name <- gdd.field("name", gdd.string)
use lives <- gdd.field("lives", gdd.int)
use nicknames <- gdd.field("nicknames", gdd.list(gdd.string))
gdd.success(Cat(name:, lives:, nicknames:))
}

decode.parse(from: data, using: cat_decoder)
let assert Ok(cbor) = gbor_decode.from_bit_array(data)

gdd.run(gbor_decode.cbor_to_dynamic(cbor), cat_decoder)
}

pub fn main() {
let assert Ok(bin_cat) =
bit_array.base64_decode(
"o2RuYW1lZEx1Y3llbGl2ZXMIaW5pY2tuYW1lc4JqTHVja3kgTHVjeWNMdWM=",
)
assert Ok(Cat("Lucy", 8, ["Lucky Lucy", "Luc"])) == decode_cat(bin_cat)
}
```

Expand Down
2 changes: 1 addition & 1 deletion src/gbor/decode.gleam
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ pub fn tagged_decoder(
///
/// It takes a bit array and returns a result containing the decoded CBOR value
///
pub fn decode(data: BitArray) -> Result(g.CBOR, CborDecodeError) {
pub fn from_bit_array(data: BitArray) -> Result(g.CBOR, CborDecodeError) {
case decode_helper(data) {
Ok(#(v, <<>>)) -> Ok(v)
Ok(#(_, rest)) ->
Expand Down
4 changes: 2 additions & 2 deletions test/round_trip_test.gleam
Original file line number Diff line number Diff line change
Expand Up @@ -254,7 +254,7 @@ pub fn decode_dynamic_test() {
"A2646E616D6574323031332D30332D32315432303A30343A30305A63646F62C074323031332D30332D32315432303A30343A30305A",
)

let assert Ok(cbor_val) = d.decode(bin)
let assert Ok(cbor_val) = d.from_bit_array(bin)
let dyn_val = d.cbor_to_dynamic(cbor_val)

let decoder = {
Expand All @@ -272,7 +272,7 @@ pub fn decode_dynamic_test() {

fn round_trip(expected: g.CBOR, hex: String) -> Result(Nil, String) {
let assert Ok(binary) = bit_array.base16_decode(hex)
let assert Ok(v) = d.decode(binary)
let assert Ok(v) = d.from_bit_array(binary)
use <- bool.guard(
v != expected,
Error(
Expand Down