datalit 0.1.0-alpha.4

A zero-runtime fluent data description macro
Documentation
<!-- markdownlint-disable MD041 -->

This crate defines the [`datalit!`] procedural macro, which generates
static byte slices from a declarative syntax.

# Features

- Readable declarative syntax: hex & binary blobs, typed ints, bytes, strings, blocks.
- Relative offsets & forward refs: `start/end/len('label)` auto‑update when
  layout changes.
- Mixed endianness: per‑value suffixes or a persistent `@endian = le|be|ne` mode.
- 24‑bit + standard integer widths, arrays (`[x; N]` & compound), alignment
  with `align(N)`.
- Convenience literals: C‑strings (auto null), large underscored numbers, repetition.
- Zero‑cost & `no_std`: expands to a static byte slice; all validation at
  compile time.

# Example

This is the start of a simple PNG file header and block format:

```rust
# use datalit::datalit;
let png_data = datalit!(
  // Unannotated hex literals are interpreted as raw bytes.
  0x89,
  // Binary strings are translated directly.
  b"PNG",
  0x0D0A_1A_0A,

  // PNG Chunk:

  // Data length is big-endian u32.
  //
  // This is resolved from the length in bytes from the upcoming chunk.
  len('chunk1): u32_be,

  // You can set the endian mode to avoid redundancy
  @endian = be,

  // The PNG chunk type is a 4-byte ASCII code.
  b"IHDR",
  'chunk1: {
    // Width
    256u32,
    // Height
    256u32,

    // Bit depth
    16u8,
    // Color type
    0u8,
    // Filter, Interlace
    0u8, 0u8
  },
  // The CRC. Not supported directly.
  0xDEADBEEF,
);
```

See the [`datalit!`] macro definition for more details.