Crate serde_bencoded[][src]

Expand description

Yet another encoding/decoding library for bencode.

I believe deserializer don’t allocate memory. Serializer allocates only when sort_dictionary feature enabled. I think this crate is fast enough.

Examples

For .torrent parsing example see examples directory

Caveats

serde treats [u8; N], Vec<u8>, &[u8] like any other sequence, that is it will be encoded as list of bytes(not a byte string).

Solution - use serde_bytes.

Serializing map with Option values

You will need to write a custom ser/de helper. For inspiration see https://github.com/serde-rs/serde/issues/550#issuecomment-246746639

Serializing Option

Use #[serde(skip_serializing_if = "Option::is_none")] annotation or see serde_with::skip_serializing_none

Behaviour

This crate does sort dictionary by keys if sort_dictionary feature is enabled (enabled by default). Otherwise order of elements can vary (depends on Serialize trait implementation).

Mapping of rust types to bencode

Alternatives

Arbitrary order. Search more on crates.io or lib.rs.

Bencoding

Supported data types

Byte Strings

<base ten ASCII>:<string bytes>

Examples:

  • 4:abcd
  • 0:

Integers

i<base ten ASCII, optional minus sign>e

The maximum number is not specified. This crate handles integers as u64 or i64.

Examples:

  • i123456e
  • i-5e

Malformed:

  • i03e, anything that starts with 0, except i0e
  • i-0e

Lists

l<bencode type values>e

Examples:

  • li0ei1ei2ee == [1,2,3]
  • le == []

Dictionaries

d<bencoded string><bencoded element>e

Keys must be sorted as raw strings. string’s should be compared using a binary comparison.

Examples:

  • de == {}
  • d4:rustl2:is7:awesomeee == {"rust" => ["is", "awesome"]}

Crate features

sort_dictionary

Enables sort by keys when serializing to bencode dictionary.

Structs

Deserializer
Serializer

Enums

DeError
SerError

Functions

from_bytes

Deserializes bencoded bytes to rust’s value.

from_bytes_auto

The same as from_bytes but deserialize_any will deserialize byte string as str if input bytes are valid UTF-8, otherwise as bytes.

from_str

Deserializes bencoded &str to rust’s value.

from_str_auto

The same as from_str but deserialize_any will deserialize byte string as str if input bytes are valid UTF-8, otherwise as bytes

to_string

Serializes rust’s type to bencode string

to_vec

Convenient function to get encoded value as bytes

to_writer

Serializes rust’s type to bencode using Write trait

Type Definitions

DeResult
SerResult