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 starts at docs/index.md 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 Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

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

rustruct-0.1.4-cp311-abi3-win_arm64.whl (297.3 kB view details)

Uploaded CPython 3.11+Windows ARM64

rustruct-0.1.4-cp311-abi3-win_amd64.whl (308.8 kB view details)

Uploaded CPython 3.11+Windows x86-64

rustruct-0.1.4-cp311-abi3-musllinux_1_2_x86_64.whl (653.7 kB view details)

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

rustruct-0.1.4-cp311-abi3-musllinux_1_2_aarch64.whl (613.0 kB view details)

Uploaded CPython 3.11+musllinux: musl 1.2+ ARM64

rustruct-0.1.4-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (439.6 kB view details)

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

rustruct-0.1.4-cp311-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (434.9 kB view details)

Uploaded CPython 3.11+manylinux: glibc 2.17+ ARM64

rustruct-0.1.4-cp311-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl (776.9 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.4-cp311-abi3-win_arm64.whl.

File metadata

  • Download URL: rustruct-0.1.4-cp311-abi3-win_arm64.whl
  • Upload date:
  • Size: 297.3 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.4-cp311-abi3-win_arm64.whl
Algorithm Hash digest
SHA256 3e90fa27d49054efe9db17da57b7fa22ed475a059f82cdcd518a207cf6171254
MD5 cc8033a60ce5c00a399ad316a35c5342
BLAKE2b-256 046d05a2104049fd2aed0b04d94a45bc37f30ce721c4c29814ae9f6f735da7ab

See more details on using hashes here.

Provenance

The following attestation bundles were made for rustruct-0.1.4-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.4-cp311-abi3-win_amd64.whl.

File metadata

  • Download URL: rustruct-0.1.4-cp311-abi3-win_amd64.whl
  • Upload date:
  • Size: 308.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.4-cp311-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 a49a9c73687be5774d0cb9150569a6bf46a1a3c6b8bc29bd53c8b6d2977e40e8
MD5 2db460f5b2764173f086ff5afd17f92a
BLAKE2b-256 57f8cd7ab0f9119b107e3f3f0e87be9c7c247cb070cec6f32b5ef5e48da8281e

See more details on using hashes here.

Provenance

The following attestation bundles were made for rustruct-0.1.4-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.4-cp311-abi3-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for rustruct-0.1.4-cp311-abi3-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 2088050b0654654c19a606157409c2fd5db8a5e3d13d321ec87d2d27b8c61549
MD5 34fb2e8a2536f7398b8fed73065a6f76
BLAKE2b-256 dbd1d0c8269e0fb4823e0a1541c1a485c1dcffccf0a949e115a5570a9f495b53

See more details on using hashes here.

Provenance

The following attestation bundles were made for rustruct-0.1.4-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.4-cp311-abi3-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for rustruct-0.1.4-cp311-abi3-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 beb39631cdd1b627feb31eb402fa0fb7a04e2ee221aa638cf219f8d2f28d8afc
MD5 fd78a7c73a4037f40214ad360e5869d5
BLAKE2b-256 b0d1f73416a68403d62a2fd34fcab550eca13bf6945c01502e43e5c268f70949

See more details on using hashes here.

Provenance

The following attestation bundles were made for rustruct-0.1.4-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.4-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for rustruct-0.1.4-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 6166c946cf5d3ceb6ceea053feff3fab24513c9b6b269ce13566e6eaa0e5b488
MD5 aff9c0edb2565b1e8dfbb7d10e967b4a
BLAKE2b-256 787c71fffced159f7e3c031ee7226c58ecdf4be3e02a052fda9ed7c3a88a10ba

See more details on using hashes here.

Provenance

The following attestation bundles were made for rustruct-0.1.4-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.4-cp311-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for rustruct-0.1.4-cp311-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 3ebec1429226c3af69cc4dd5683a743bf2322a9e8986759e55c30ea5aff56fe6
MD5 98b1e9116c75e9b5bff9ab20035b320d
BLAKE2b-256 8aa8d4efd71d44a4e8a41ecdec552ec75a8569775bb3962e0f9923412f9d875f

See more details on using hashes here.

Provenance

The following attestation bundles were made for rustruct-0.1.4-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.4-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.4-cp311-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
Algorithm Hash digest
SHA256 d6e6903386b06fa46fc330b658cc0260fd78a887f4dc753c30bc7deeb3aedece
MD5 83aba7bb06ff6aeabcf27a3552e6b847
BLAKE2b-256 ab902347a4112f41ae3a821638d2de56c56a71aa6e34426f1e57351e1ede6757

See more details on using hashes here.

Provenance

The following attestation bundles were made for rustruct-0.1.4-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