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 Distribution

rustruct-0.1.5.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.5-cp311-abi3-win_arm64.whl (301.4 kB view details)

Uploaded CPython 3.11+Windows ARM64

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

Uploaded CPython 3.11+Windows x86-64

rustruct-0.1.5-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.5-cp311-abi3-musllinux_1_2_aarch64.whl (617.0 kB view details)

Uploaded CPython 3.11+musllinux: musl 1.2+ ARM64

rustruct-0.1.5-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.5-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.5-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.5.tar.gz.

File metadata

  • Download URL: rustruct-0.1.5.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.5.tar.gz
Algorithm Hash digest
SHA256 a3a7cd14676ebbeaab84825de150b769d510a75a644d542e0df79092f00d66bb
MD5 ec86f3e6b66328f5bfdd90fdd1a9c84a
BLAKE2b-256 46361d62de30a58ffcd5371d246115fcfd6d0eb6b1f600cdd1c517125f4b5cfd

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: rustruct-0.1.5-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.5-cp311-abi3-win_arm64.whl
Algorithm Hash digest
SHA256 70a293a5ec4a6fa8b8cc29177b6b13deb586cfa14cae25331863fe8dfc40318f
MD5 2bb2f09f2a9dfcd2fb3661b04d1cd994
BLAKE2b-256 6538a7d019ce59f446912bc53a39e88c10072c601c3910e14609a7c09d75dc64

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: rustruct-0.1.5-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.5-cp311-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 692eab738cf2e8e5f1ae27c8b2c029b826519214e70840a7f84659162feef8cb
MD5 f2280183d4f8ed0c7756e50ba7bccf41
BLAKE2b-256 0e0fa57e9f2de1702bc63b1ea5db50516c38cf14415984db72843dc9d8a2281f

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rustruct-0.1.5-cp311-abi3-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 921c78cf1d791106bfd7a4636a52d69d5bbf1ef77a7caf038c02e32d2907bf18
MD5 ab8406fd0984403cde73f606e7313418
BLAKE2b-256 c05ddd8f227ee614e6f5df963974d2d7207fbda140f166f4de3057166046d4c8

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rustruct-0.1.5-cp311-abi3-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 9f0fe322b8b1f103de742a8c427650793655fb316ee5ad80d263667056aedd37
MD5 da6520fa3bcd0c949f7da4a1b5fc1e43
BLAKE2b-256 ef8b7ebb2e71fcde145dd82a4d1a1d89231dabe99f87ab328b1a6276dbcae354

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rustruct-0.1.5-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 aa8409c531de2688c2099549a191c7ea6c3ab7aa341c29b453a5aba60cf517ac
MD5 34af4c803a2104e8b0ba0a7494dea518
BLAKE2b-256 495802fc787d2557c39927baaf0712c0d5f39032d4153bc1c56ec0051513831f

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for rustruct-0.1.5-cp311-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 101e3e2e41ba9271a5520cad8022b38342b05ae10c3eac64731a1033f01573cb
MD5 5badb762188f490ffcb87676e2552646
BLAKE2b-256 d11a43d582e3a38e17329aa3441cdc64efaf57645a96da76204bf6f20a3b97ff

See more details on using hashes here.

Provenance

The following attestation bundles were made for rustruct-0.1.5-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.5-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.5-cp311-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
Algorithm Hash digest
SHA256 ad4f013c7f70ce45d22bbd30a7c30f063d29d56552a94ae7ec6bdd6abf343463
MD5 c2ca9bcf6ce501ffbcbcdb1e4461cee2
BLAKE2b-256 925efa457d86a9c1c6ff3bdd41e2c27dc85c44c3e2fd83dfffea6f851a6e6b1e

See more details on using hashes here.

Provenance

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