protobin
Decode the protobuf wire format using gleam Decoders!
There is currently no support for encoding the protobuf wire format.
Groups (SGROUP and EGROUP) are not supported. By default, parsing fails if
one is encountered. See Config.ignore_groups for more information.
gleam add protobin@1
import protobin
import gleam/option
type Person {
Person(
id: Int,
name: String,
age: option.Option(Int),
score: Int,
fav_nums: List(Int),
)
}
fn person_decoder() -> Decoder(Person) {
use id <- decode.field(3, protobin.decode_fixed(64))
use age <- decode.optional_field(
1,
option.None,
decode.optional(protobin.decode_uint()),
)
use score <- decode.field(2, protobin.decode_uint())
use fav_nums <- decode.field(
42,
decoders.multiple(of: protobin.decode_uint(), using: protobin.read_varint),
)
Person(id:, age:, score:) |> decode.success
}
pub fn main() -> Nil {
let path = "./path/to/person.pb"
let assert Ok(bits) = file.read_bits(from: path)
let assert Ok(Parsed(value: person, rest: <<>>, pos: _)) =
protobin.parse(from: bits, using: person_decoder())
assert person
== Person(
id: 42,
name: "Aria",
age: option.Some(150),
score: 81_050,
)
}
Further documentation can be found at https://hexdocs.pm/protobin.
Development
gleam run # Run the project
gleam test # Run the tests