Skip to main content

Rust core for parsing and building binary wire formats from Python

Project description

rustruct

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 Distribution

rustruct-0.1.1.tar.gz (89.8 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.1-cp311-abi3-win_arm64.whl (292.6 kB view details)

Uploaded CPython 3.11+Windows ARM64

rustruct-0.1.1-cp311-abi3-win_amd64.whl (304.1 kB view details)

Uploaded CPython 3.11+Windows x86-64

rustruct-0.1.1-cp311-abi3-musllinux_1_2_x86_64.whl (649.0 kB view details)

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

rustruct-0.1.1-cp311-abi3-musllinux_1_2_aarch64.whl (608.2 kB view details)

Uploaded CPython 3.11+musllinux: musl 1.2+ ARM64

rustruct-0.1.1-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (434.9 kB view details)

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

rustruct-0.1.1-cp311-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (430.2 kB view details)

Uploaded CPython 3.11+manylinux: glibc 2.17+ ARM64

rustruct-0.1.1-cp311-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl (772.3 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.1.tar.gz.

File metadata

  • Download URL: rustruct-0.1.1.tar.gz
  • Upload date:
  • Size: 89.8 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.1.tar.gz
Algorithm Hash digest
SHA256 b8e4c160095b99d6724f11cb49db29fc6ad082cdb475566758c8b2bef12edc64
MD5 dc538b5a92b6eba1dba12f97574d90b2
BLAKE2b-256 07957b54654f6c3fbddedac065d7c3bb1b2d3b564382f3770a093b01dc93624d

See more details on using hashes here.

Provenance

The following attestation bundles were made for rustruct-0.1.1.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.1-cp311-abi3-win_arm64.whl.

File metadata

  • Download URL: rustruct-0.1.1-cp311-abi3-win_arm64.whl
  • Upload date:
  • Size: 292.6 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.1-cp311-abi3-win_arm64.whl
Algorithm Hash digest
SHA256 02a007ac685f80a7e02db880887699d0d7ed00a791ce3c783773b05fe31c11ab
MD5 ae7319ca0d916776d7fe3efe9cbb32a6
BLAKE2b-256 4a9b00e27ebd059c44f6fd03c3998eaaf99c69299624aa15985fb7081728e76e

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: rustruct-0.1.1-cp311-abi3-win_amd64.whl
  • Upload date:
  • Size: 304.1 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.1-cp311-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 92b9d5ea16ad48ff6883b20f27fdd537fb96b51bd908d921bd399739c826c013
MD5 152492951c8b627458f8b85a2c63218d
BLAKE2b-256 1e5f51acca1d8b443de4cf580ead0beac7ff9018c578ac3ba0e6705040e36138

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rustruct-0.1.1-cp311-abi3-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 551821ca581ecc5174c05214df2b0c0d699ed0c0c9453cdf2cd6930c68966974
MD5 ebadfc95a88fb2edab8c15fb95241918
BLAKE2b-256 67af77a15452d6a2839d6ccf807528c5ef06eccc8036c98b8d834496a4d0377d

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rustruct-0.1.1-cp311-abi3-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 8f186bd77a8bd32579a1e3b0ab942aac0027a0f19f93ca79dd12985d645feebd
MD5 6d9277c538cedc0839193c11c49b76f2
BLAKE2b-256 97e6b09b9147d614d85d090accb7249915ced54e82ae9e5d33175fe113bb3453

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rustruct-0.1.1-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 b0ca7af7a09166bb5a27d055146e2e2d805e20eab8071bb23a9845d178b6106f
MD5 495bce08df201700599f4cff0b8d1b04
BLAKE2b-256 c73da1292e49773516c5ba3918dcdedb2cf035b6add33a37c46bffdbbfee12a4

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rustruct-0.1.1-cp311-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 650d550950d35634435eba0d8fe8d1f581300b180399f594ef7deed5fedf196e
MD5 f52fb50249af40c2ec66fcf097a0c002
BLAKE2b-256 dbb5f16023f5291f202ca1ba9c1dde3b226635925394ab51598f7fe3fc72c146

See more details on using hashes here.

Provenance

The following attestation bundles were made for rustruct-0.1.1-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.1-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.1-cp311-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
Algorithm Hash digest
SHA256 c7e6685e8ce9646643f17bedd809549ad549d537707a43856ec1c39429b275f1
MD5 6ee2b92dc42cf785fd7e1aa1f9f86424
BLAKE2b-256 35840224cbf96b4e5203c83f74cda331a76dff40fc9d340103d9ea1ed39d405f

See more details on using hashes here.

Provenance

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