Skip to main content

Rust core for parsing and building binary wire formats from Python

Project description

rustruct

Tests Latest Version Python Versions License

A Rust core for parsing and building binary wire formats from Python.

A declarative schema built from Python primitives is compiled into a program executed with a single Python -> Rust call for the whole structure. The parse result is a plain dict.

Building and testing

# Rust core (no Python)
cargo test -p rustruct-core

# Python package (maturin backend) + pytest
uv sync
uv run pytest

# Sphinx documentation (warnings are errors)
make test-docs

Example

from rustruct import Field, Incomplete, compile

codec = compile(
    (
        Field(name="tag", kind="u8", opts={}),
        Field(name="size", kind="u8", opts={}),
        Field(
            name="value",
            kind="struct",
            opts={
                "fields": (Field(name="payload", kind="bytes", opts={"len": "*"}),),
                "size": ("ref", "size"),
            },
        ),
        Field(name="crc", kind="digest", opts={"algo": "crc32", "over": "*"}),
    )
)

data = codec.pack({"tag": 7, "value": {"payload": b"abc"}})
# size and crc are derived: computed and patched in automatically

values = codec.unpack(data)  # full buffer, a tail is an error
values, pos = codec.unpack_from(data, 0)  # a tail is allowed

r = codec.parse(data[:3])  # streaming parse
if not r:  # Incomplete: not enough data yet
    print("need at least", r.needed, "more bytes")

Documentation

The full documentation is at mosquito.github.io/rustruct and is organised by user need: a guided tutorial, task-oriented how-to guides, explanations of the schema and execution model, and concise API reference.

Declarative frontend

A Struct metaclass on top of compile()/Codec: class-body annotations and field descriptors (described, slice, array, switch, bits, convert, sized, an open registry()) compile lazily, per class, into a Codec, and convert to/from typed instances rather than plain dicts.

from rustruct import Struct, U8, U16, switch, slice, registry

Payload = Struct  # a registry base: class Foo(Payload, registry=True): ...

See src/rustruct/protocols/{inet,tcp,udp,dns}.py for a full worked example (IPv4/TCP/UDP header dispatch via an open registry, DNS with hand-written name-compression as the one piece that doesn't fit the declarative model) and tests/test_frontend_*.py, tests/test_protocols_*.py for the tests.

Repository layout

crates/rustruct/       core (rustruct-core): schema compiler, unpack/pack,
                       expressions, bits, flags, windows, digests; zero pyo3
crates/rustruct-py/    pyo3 cdylib -> the rustruct.core module
src/rustruct/          Python wrapper: low-level re-export, __abi__ check,
                       the Struct frontend (struct.py/fields.py/scalars.py/
                       expr.py), and protocols/ (IPv4/TCP/UDP/DNS example)
tests/                 pytest tests: public API, frontend, protocols
docs/                  tutorials, how-to guides, explanation, API reference
crates/rustruct/tests/ Rust integration tests, one file per feature, plus
                       tests/common/mod.rs for shared helpers
benchmark/             a separate uv project comparing rustruct against
                       struct/ctypes/dataclasses-struct/construct

Implementation status

Covered:

  • all fixed-width types, raw, bytes/str/cstr, bits (MSB-first), flags (keep/strict/ignore), struct (including size windows), array (count/until_eof), switch, digest (CRC presets with Rocksoft overrides, md5/sha1/sha256, over as a name tuple or "*" with self-zeroing);
  • expressions (the full operator set), lexical backward-only ref resolution, registers and span registers, limits (max, max_count, depth 64, an 8-deep Expr stack);
  • pack with backpatching: derived lengths (linear inversion a*x + b, including derived bits fields), digests computed innermost-first, consistency checks across multiple consumers of one register;
  • the streaming contract: parse -> Incomplete.needed with monotonic progress, distinguishing "hit a window boundary" (Invalid) from "ran out of buffer" (Incomplete);
  • errors carry kind/path/offset; the path is assembled only while unwinding;
  • coalescing of fixed fields (a static schema lowers to exactly one Fixed op, enforced by a test), min_size/static_size.

Known gaps and limitations:

  • to_bytes/from_bytes (Program serialization) raise NotImplementedError; the cache format hasn't been designed.
  • A switch discriminant is never derived from its own on= ref at pack time: the caller always supplies it explicitly, and a field cannot be both derived and a switch discriminant (SchemaError).
  • byteorder accepts "network" as a struct-module-style alias for "big". "native" is forbidden, since it would make the wire format depend on the machine running the code.
  • String encodings in the core: utf-8 / ascii / latin-1, errors="strict" only. Other CPython codecs are a frontend concern; the core currently raises SchemaError for anything else.
  • An extra digest.algo="ip" preset (RFC 1071, the IPv4 header checksum) is needed for the bundled IPv4 reference format.
  • No cargo-fuzz targets and no refcount tests yet; deterministic and randomized round-trip tests stand in for a proper proptest-based fuzz suite.
  • The hot path still builds an intermediate Value tree (the core stays Python-free); raw FFI and METH_FASTCALL benchmarking haven't been done.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

rustruct-0.1.6.tar.gz (94.7 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

rustruct-0.1.6-cp311-abi3-win_arm64.whl (301.4 kB view details)

Uploaded CPython 3.11+Windows ARM64

rustruct-0.1.6-cp311-abi3-win_amd64.whl (312.8 kB view details)

Uploaded CPython 3.11+Windows x86-64

rustruct-0.1.6-cp311-abi3-musllinux_1_2_x86_64.whl (657.8 kB view details)

Uploaded CPython 3.11+musllinux: musl 1.2+ x86-64

rustruct-0.1.6-cp311-abi3-musllinux_1_2_aarch64.whl (617.1 kB view details)

Uploaded CPython 3.11+musllinux: musl 1.2+ ARM64

rustruct-0.1.6-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (443.7 kB view details)

Uploaded CPython 3.11+manylinux: glibc 2.17+ x86-64

rustruct-0.1.6-cp311-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (439.0 kB view details)

Uploaded CPython 3.11+manylinux: glibc 2.17+ ARM64

rustruct-0.1.6-cp311-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl (781.0 kB view details)

Uploaded CPython 3.11+macOS 10.12+ universal2 (ARM64, x86-64)macOS 10.12+ x86-64macOS 11.0+ ARM64

File details

Details for the file rustruct-0.1.6.tar.gz.

File metadata

  • Download URL: rustruct-0.1.6.tar.gz
  • Upload date:
  • Size: 94.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for rustruct-0.1.6.tar.gz
Algorithm Hash digest
SHA256 8baa2c787ef9534844cb3fd68bf2e7a2bcc82e0385faea83519d3befd22f63d0
MD5 62e4098017d05bc457bb627d61b0eb36
BLAKE2b-256 f4d774956ca726f2fe14dc0b30115ac45e1d70582643ac4c4817e56b2c97d659

See more details on using hashes here.

Provenance

The following attestation bundles were made for rustruct-0.1.6.tar.gz:

Publisher: publish.yml on mosquito/rustruct

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rustruct-0.1.6-cp311-abi3-win_arm64.whl.

File metadata

  • Download URL: rustruct-0.1.6-cp311-abi3-win_arm64.whl
  • Upload date:
  • Size: 301.4 kB
  • Tags: CPython 3.11+, Windows ARM64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for rustruct-0.1.6-cp311-abi3-win_arm64.whl
Algorithm Hash digest
SHA256 2a06bb1b34eba59d90e776da92b94110a9fc4ec7a9fac5140179509947accde5
MD5 3fcc97883b43cfceebad74b19313a99a
BLAKE2b-256 eeded5c0dddb93c98b5b4e01f6065484d3b5f463ececf6cfc68a891a9f6712d8

See more details on using hashes here.

Provenance

The following attestation bundles were made for rustruct-0.1.6-cp311-abi3-win_arm64.whl:

Publisher: publish.yml on mosquito/rustruct

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rustruct-0.1.6-cp311-abi3-win_amd64.whl.

File metadata

  • Download URL: rustruct-0.1.6-cp311-abi3-win_amd64.whl
  • Upload date:
  • Size: 312.8 kB
  • Tags: CPython 3.11+, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for rustruct-0.1.6-cp311-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 5a1eab9812226e4c6c40e1fe4a0832164e01b9c8768366b90eb3992192d68128
MD5 16b05efd58c45b350bbd2e2478fc522e
BLAKE2b-256 328039050561bb3c309d8bf2d34e1a966958f5aade1012a1db6e1ccfc6536bc3

See more details on using hashes here.

Provenance

The following attestation bundles were made for rustruct-0.1.6-cp311-abi3-win_amd64.whl:

Publisher: publish.yml on mosquito/rustruct

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rustruct-0.1.6-cp311-abi3-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for rustruct-0.1.6-cp311-abi3-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 5c4f8aff757cfeab766ad69ca88c564834ca2e4fb280535367e9399da3119d17
MD5 a1fff38fb6df50c9ee3be397f65ee84e
BLAKE2b-256 a78408c8fe436b43aa1d101d84555d6d91535ce65912a2e3adef20e8c3489b04

See more details on using hashes here.

Provenance

The following attestation bundles were made for rustruct-0.1.6-cp311-abi3-musllinux_1_2_x86_64.whl:

Publisher: publish.yml on mosquito/rustruct

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rustruct-0.1.6-cp311-abi3-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for rustruct-0.1.6-cp311-abi3-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 5fa0614c5c383d583787b23447b38a7bfef428d516d642a4330f4c6bc374bb8b
MD5 4bca7ac0cc610a7a80684f1a692229b1
BLAKE2b-256 789ff9c4d797b4fdc2f4e587fc9522b245588a5638babd5b7a64503929df69a2

See more details on using hashes here.

Provenance

The following attestation bundles were made for rustruct-0.1.6-cp311-abi3-musllinux_1_2_aarch64.whl:

Publisher: publish.yml on mosquito/rustruct

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rustruct-0.1.6-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for rustruct-0.1.6-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 8f77e9b12a986ac1307bc608d0eee76723ea576101a5bde657c9b5e149cf8cf0
MD5 c13dc8774fbad929a888fdebd3c10b26
BLAKE2b-256 d333dd9a12aa9f954a003949d7ce1fd331f7243334eafdb5549802182c1fa9cf

See more details on using hashes here.

Provenance

The following attestation bundles were made for rustruct-0.1.6-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: publish.yml on mosquito/rustruct

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rustruct-0.1.6-cp311-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for rustruct-0.1.6-cp311-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 41f5d544ff70b169731afe7ccf577b44d37800f878526f3abf6146447ba785e0
MD5 3d8a97620e2e7bfc45797167b8088bbe
BLAKE2b-256 c38062296034c46ae3021e9db816cad2d411990d6228e94abee3455624ce7eaf

See more details on using hashes here.

Provenance

The following attestation bundles were made for rustruct-0.1.6-cp311-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: publish.yml on mosquito/rustruct

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rustruct-0.1.6-cp311-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl.

File metadata

File hashes

Hashes for rustruct-0.1.6-cp311-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
Algorithm Hash digest
SHA256 9aad13023b4e03939704c31af72f2f9958043e3f8f576b1de22a769a0dcd4ef8
MD5 486ca516f103d51b06cd55ccda21964a
BLAKE2b-256 b359cd9bb881a850cb064c02d55717c48061a3d413159063e60feb0ce1cc5ad6

See more details on using hashes here.

Provenance

The following attestation bundles were made for rustruct-0.1.6-cp311-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl:

Publisher: publish.yml on mosquito/rustruct

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page