···7788import internal/util
99import protobuf_decode_gleam.{
1010- type BytePos, type DecodeResult, type ValueParser, Parsed, parse, read_varint,
1010+ type BytePos, type DecodeResult, type ValueParser, Parsed, parse, parse_varint,
1111}
12121313/// Decode a repeated field that may be either packed or expanded.
···95959696pub fn uint() -> Decoder(Int) {
9797 use bits <- decode.then(single_or_raw(decode.bit_array))
9898- use bits <- decode.then(case read_varint(bits, 0) {
9898+ use bits <- decode.then(case parse_varint(bits, 0) {
9999 Ok(Parsed(value:, rest: <<>>, pos: _)) -> decode.success(value)
100100 _ -> decode.failure(<<>>, "uint")
101101 })
+26-18
src/protobuf_decode_gleam.gleam
···9393 Field(key: Dynamic, value: Dynamic)
9494}
95959696-fn wire_type_consume_fn(ty: WireType) -> ValueParser {
9696+fn wire_type_read_fn(ty: WireType) -> ValueParser {
9797 case ty {
9898- wire_type.VarInt -> consume_varint
9898+ wire_type.VarInt -> read_varint
9999 wire_type.I64 -> read_fixed(64)
100100 wire_type.Len -> read_len
101101 wire_type.I32 -> read_fixed(32)
···103103}
104104105105fn read_field(bits: BitArray, tag_pos: BytePos) -> DecodeResult(Parsed(Field)) {
106106- use Parsed(value: tag, rest: bits, pos:) <- result.try(read_varint(
106106+ use Parsed(value: tag, rest: bits, pos:) <- result.try(parse_varint(
107107 bits,
108108 tag_pos,
109109 ))
···124124 UnknownWireType(wire_type, pos: tag_pos),
125125 ))
126126127127- let consume = wire_type_consume_fn(wire_type)
127127+ let read = wire_type_read_fn(wire_type)
128128 use value: Parsed(Dynamic) <- result.try(
129129- consume(bits, pos) |> result.map(parsed_map(_, dynamic.bit_array)),
129129+ read(bits, pos) |> result.map(parsed_map(_, dynamic.bit_array)),
130130 )
131131132132 let field =
···141141pub type ValueParser =
142142 fn(BitArray, BytePos) -> ValueResult
143143144144-pub fn consume_varint(bits: BitArray, pos: BytePos) -> ValueResult {
145145- consume_varint_acc(bits, <<>>, pos)
144144+/// Reads the bits from a varint and returns *all* of them. They cannot be
145145+/// parsed as a uint.
146146+///
147147+/// Specifically, the continuation bits are included, so the value's bit size
148148+/// will be a multiple of 8.
149149+pub fn read_varint(bits: BitArray, pos: BytePos) -> ValueResult {
150150+ read_varint_acc(bits, <<>>, pos)
146151}
147152148148-fn consume_varint_acc(
149149- bits: BitArray,
150150- acc: BitArray,
151151- pos: BytePos,
152152-) -> ValueResult {
153153+fn read_varint_acc(bits: BitArray, acc: BitArray, pos: BytePos) -> ValueResult {
153154 case bits {
154155 <<0:size(1), n:bits-size(7), rest:bytes>> -> {
155156 let bit = <<0:size(1), n:bits>>
···158159 }
159160 <<1:size(1), n:bits-size(7), rest:bytes>> -> {
160161 let bit = <<1:size(1), n:bits>>
161161- consume_varint_acc(rest, bit_array.concat([acc, bit]), pos + 1)
162162+ read_varint_acc(rest, bit_array.concat([acc, bit]), pos + 1)
162163 }
163164 bits -> Error(InvalidVarInt(leftover_bits: bits, acc:, pos:))
164165 }
165166}
166167167167-pub fn read_varint(bits: BitArray, pos: BytePos) -> ValueResult {
168168- read_varint_acc(bits, <<>>, pos)
168168+/// Reads the bits from a varint and parses them a BitArray. The returned bits
169169+/// can be parsed as a uint.
170170+///
171171+/// For a decoder that does this, use `decoders.uint()`.
172172+///
173173+/// The continuation bits are not included, so the value's bit size will be a
174174+/// multiple of 7.
175175+pub fn parse_varint(bits: BitArray, pos: BytePos) -> ValueResult {
176176+ parse_varint_acc(bits, <<>>, pos)
169177}
170178171171-fn read_varint_acc(bits: BitArray, acc: BitArray, pos: BytePos) -> ValueResult {
179179+fn parse_varint_acc(bits: BitArray, acc: BitArray, pos: BytePos) -> ValueResult {
172180 case bits {
173181 <<0:size(1), n:bits-size(7), rest:bytes>> -> {
174182 let acc = bit_array.concat([n, acc])
175183 Ok(Parsed(value: acc, rest:, pos: pos + 1))
176184 }
177185 <<1:size(1), n:bits-size(7), rest:bytes>> ->
178178- read_varint_acc(rest, bit_array.concat([n, acc]), pos + 1)
186186+ parse_varint_acc(rest, bit_array.concat([n, acc]), pos + 1)
179187 bits -> {
180188 Error(InvalidVarInt(leftover_bits: bits, acc:, pos:))
181189 }
···197205fn read_len(bits: BitArray, len_pos: BytePos) -> ValueResult {
198206 // First, read the length of the value
199207 // It is encoded as a varint immediately after the tag
200200- use Parsed(value: len, rest: bits, pos:) <- result.try(read_varint(
208208+ use Parsed(value: len, rest: bits, pos:) <- result.try(parse_varint(
201209 bits,
202210 len_pos,
203211 ))