arti/crates/tor-bytes
Nick Mathewson de13a7319b Bump patchlevel versions on crates with smaller changes
Done with the commands below.

The following crates have had various changes, and should get a
patchlevel bump. Since they are pre-1.0, we do not need to
distinguish new APIs from other changes.

```
cargo set-version --bump patch -p arti-client
cargo set-version --bump patch -p safelog
cargo set-version --bump patch -p tor-bytes
cargo set-version --bump patch -p tor-cert
cargo set-version --bump patch -p tor-circmgr
cargo set-version --bump patch -p tor-config
cargo set-version --bump patch -p tor-consdiff
cargo set-version --bump patch -p tor-dirclient
cargo set-version --bump patch -p tor-dirmgr
cargo set-version --bump patch -p tor-error
cargo set-version --bump patch -p tor-hsservice
cargo set-version --bump patch -p tor-linkspec
cargo set-version --bump patch -p tor-llcrypto
cargo set-version --bump patch -p tor-netdir
cargo set-version --bump patch -p tor-netdoc
cargo set-version --bump patch -p tor-proto
cargo set-version --bump patch -p tor-rpcbase
cargo set-version --bump patch -p tor-socksproto
```

This crate has new features, but no new non-experimental Rust APIs.
So even though it is post-1.0, it gets a patchlevel bump.

```
cargo set-version --bump patch -p arti
```
2023-06-30 08:42:21 -04:00
..
fuzz tor-bytes: Add take_rest and read_nested_* to fuzzer. 2023-03-06 12:39:57 -05:00
src lints: Run maint/add_warning to actually apply new lints 2023-06-21 12:15:41 +01:00
Cargo.toml Bump patchlevel versions on crates with smaller changes 2023-06-30 08:42:21 -04:00
README.md doc: consistent summary line for the READMEs 2022-12-20 14:31:47 +01:00

README.md

tor-bytes

Utilities to decode/encode things into bytes.

Overview

The tor-bytes crate is part of Arti, a project to implement Tor in Rust. Other crates in Arti use it to build and handle all the byte-encoded objects from the Tor protocol. For textual directory items, see the [tor-netdoc] crate.

This crate is generally useful for encoding and decoding byte-oriented formats that are not regular enough to qualify for serde, and not complex enough to need a full meta-language. It is probably not suitable for handling anything bigger than a few kilobytes in size.

Alternatives

The Reader/Writer traits in std::io are more appropriate for operations that can fail because of some IO problem. This crate can't handle that: it is for handling things that are already in memory.

TODO: Look into using the "bytes" crate more here.

TODO: The "untrusted" crate has similar goals to our [Reader], but takes more steps to make sure it can never panic. Perhaps we should see if we can learn any tricks from it.

TODO: Do we really want to keep Reader as a struct and Writer as a trait?

Contents and concepts

This crate is structured around four key types:

  • [Reader]: A view of a byte slice, from which data can be decoded.
  • [Writer]: Trait to represent a growable buffer of bytes. (Vec<u8> and [bytes::BytesMut] implement this.)
  • [Writeable]: Trait for an object that can be encoded onto a [Writer]
  • [Readable]: Trait for an object that can be decoded from a [Reader].

Every object you want to encode or decode should implement [Writeable] or [Readable] respectively.

Once you implement these traits, you can use Reader and Writer to handle your type, and other types that are built around it.

License: MIT OR Apache-2.0