Examples¶
These examples use the generated benchmark.v2 types. Generate them with
pixi run generate if tests/generated/ is missing. The schemas and oracle
bytes behind those types are listed on Test data.
Encode and decode a Message¶
examples/encode_message.mojo:
from benchmark.v2 import Message
def main() raises:
var msg = Message()
msg.f_bool = True
msg.f_int32 = 150
msg.f_string = "hi"
var buf = msg.encode()
print("encoded", len(buf), "bytes")
var again = Message.decode(buf)
print("round-trip", again.f_int32, again.f_string)
A fuller value (f_bool=true, f_int32=150, f_int64=1, f_float64=1.5,
f_string="hi") matches official protoc --encode byte for byte:
| Bytes | Meaning |
|---|---|
08 01 |
field 1, varint, true |
10 96 01 |
field 2, varint, 150 |
18 01 |
field 3, varint, 1 |
21 + 8 bytes |
field 4, I64, IEEE-754 1.5 |
2a 02 68 69 |
field 5, LEN 2, hi |
Zero, false, and empty strings are omitted. That is proto3 implicit
presence.
Empty present submessage¶
A set-but-empty nested message is not omitted. Document.meta is field 3.
from benchmark.v2 import Document, DocumentMeta
def main() raises:
var doc = Document()
doc.id = "x"
doc.status = 1
doc.meta = DocumentMeta()
var buf = doc.encode()
# 0a 01 78 id = "x"
# 10 01 status = 1
# 1a 00 meta present, length 0
Official Python emits the same 1a 00. A second LEN record for field 3
merges into the existing DocumentMeta; it does not replace it.
Packed repeated double¶
Telemetry.values encodes as one packed LEN (field 4, tag 22).
from benchmark.v2 import Telemetry
def main() raises:
var tel = Telemetry()
tel.source = "s"
tel.ts = 9
tel.values.append(1.0)
tel.values.append(2.0)
var buf = tel.encode()
var got = Telemetry.decode(buf)
The decoder also accepts unpacked I64 records for the same field. Both
forms are legal proto3. Generated encode always writes packed.
Interop with protoc¶
printf 'f_bool: true f_int32: 150 f_string: "hi"\n' \
| python3 tests_interop/encode_ref.py benchmark.v2.Message \
> message.bin
python3 tests_interop/decode_ref.py benchmark.v2.Message < message.bin
Those scripts call protoc --encode and protoc --decode.
No length prefix
The pipe is raw protobuf bytes. There is no length prefix. The official conformance runner uses a 4-byte little-endian length prefix; do not mix the two.