#protobuf #serialization #binary-encoding #buffer #protocols #alloc #no-alloc

no-std noproto

no-std, no-alloc protocol buffers implementation for embedded systems

2 unstable releases

0.1.0 Dec 20, 2023
0.0.0 Jun 15, 2023

#2018 in Embedded development

Download history 20/week @ 2024-07-19 27/week @ 2024-07-26 16/week @ 2024-08-02 15/week @ 2024-08-09 11/week @ 2024-08-16 12/week @ 2024-08-23 13/week @ 2024-08-30 17/week @ 2024-09-06 25/week @ 2024-09-13 30/week @ 2024-09-20 29/week @ 2024-09-27 40/week @ 2024-10-04 51/week @ 2024-10-11 44/week @ 2024-10-18 52/week @ 2024-10-25 51/week @ 2024-11-01

203 downloads per month
Used in embassy-net-esp-hosted

MIT/Apache

25KB
526 lines

noproto

No-std, no-alloc protocol buffers (protobuf) implementation in Rust, for embedded systems. Optimized for binary size and memory usage, not for performance.

Status: very experimental, ☢️ do not use in production yet. In particular, it doesn't handle many protobuf types well (see below).

Features

Implemented:

  • Derive macros.
  • heapless::Vec, heapless::String impls.
  • optional
  • repeated
  • oneof
  • enum

Not implemented (yet?):

  • Support multiple protobuf encodings. Protobuf "types" are more like "type + wire encoding" all in one, so one Rust type can be encoded multiple ways on the wire. noproto currently assumes the Rust type is enough to deduce how it should be encoded on the wire, which is not true.
  • Support more types (see below)
  • Impls for alloc containers (goal is to be no-alloc, but we could still have them optionally).
  • Impls for &[T] for repeated fields (only doable for writing, not reading)
  • Tool to compile .proto files into Rust code.
  • Maps
  • Deprecated field groups.

Type mapping

Protobuf Rust
bool bool
int32 TODO
uint32 u32
sint32 i32
fixed32 TODO
sfixed32 TODO
int64 TODO
uint64 u64
sint64 i64
fixed64 TODO
sfixed64 TODO
float TODO
double TODO
string heapless::String<N>
bytes heapless::Vec<u8, N>

Minimum supported Rust version (MSRV)

noproto is guaranteed to compile on the latest stable Rust version at the time of release. It might compile with older versions but that may change in any new patch release.

License

This work is licensed under either of

at your option.

Dependencies

~435–780KB
~17K SLoC