pub fn decode(reader: *std.Io.Reader) !Tag 72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93 pub fn decode(reader: *std.Io.Reader) !Tag {
const tag1: FirstTag = @bitCast(try reader.takeByte());
var number: std.meta.Tag(Tag.Number) = tag1.number;
if (tag1.number == high_tag_marker) {
number = 0;
for (0..max_continuations) |i| {
const next: NextTag = @bitCast(try reader.takeByte());
if (i == 0 and next.number == 0) return error.InvalidEncoding;
number = std.math.shlExact(@TypeOf(number), number, 7) catch return error.InvalidEncoding;
number |= next.number;
if (!next.continues) break;
} else return error.InvalidEncoding;
if (number < high_tag_marker) return error.InvalidEncoding;
}
return Tag{
.number = @fromBackingInt(@intCast(number)),
.constructed = tag1.constructed,
.class = tag1.class,
};
}