# protobuf [JSR](https://jsr.io/@mary/protobuf) | [source code](https://tangled.sh/mary.my.id/pkg-protobuf) protobuf codec with static type inference. ```typescript import * as p from '@mary/protobuf'; // basic usage { const Person = p.message({ id: p.int64(), name: p.string(), email: p.optional(p.string()), tags: p.repeated(p.string()), }, { id: 1, name: 2, email: 3, tags: 4, }); const person: p.InferInput = { id: 123n, name: 'alice', email: 'alice@example.com', tags: ['developer', 'rust'], }; const encoded = p.encode(Person, person); const decoded = p.decode(Person, encoded); // ^? p.InferOutput const result = p.tryDecode(Person, buffer); if (result.ok) { result.value; } else { result.message; result.issues; } } // nested and self-referential messages { const Address = p.message({ street: p.string(), city: p.string(), zipCode: p.optional(p.string()), }, { street: 1, city: 2, zipCode: 3, }); const Place = p.message({ name: p.string(), address: Address, }, { name: 1, address: 2, }); const Node = p.message({ value: p.int32(), get next() { return p.optional(Node); }, }, { value: 1, next: 2, }); } ``` ## non-features - **enums support**: use `int32()` instead for open enums - **oneof support**: complicated, breaks self-referential messages - **extensions support**: not supported - **groups support**: use nested messages instead - **code generation**: no intent