ndn-tlv

Crates.iondn-tlv
lib.rsndn-tlv
version0.4.0
sourcesrc
created_at2024-02-08 18:52:29.19758
updated_at2024-09-07 14:12:19.862301
descriptionEncoding and Decoding of TLV values for Named Data Networking
homepage
repository
max_upload_size
id1132497
size39,613
(Xandaros)

documentation

README

Provides abstractions for working with TLV-encoded data

Data that may appear as part of a TLV record should implement [TlvEncode] and [TlvDecode]. Types that represent a whole TLV record should implement [Tlv] in addition to [TlvEncode] and [TlvDecode]

At the core of the library are the three traits [Tlv], [TlvEncode], and [TlvDecode].

[Tlv] should be implemented on types that represent a TLV record. In other words, types that, in their encoded form, start with a type and a length.

[TlvEncode] and [TlvDecode] are used for types that can be encoded/decoded and may appear in TLV records. All types implementing [Tlv] should also implement [TlvEncode] and [TlvDecode].

To ease implementing these traits, a derive macro Tlv is made available. Simply derive it on an enum to automatically implement [TlvEncode] and [TlvDecode]. On structs, an attribute must be present to set the type ID of the TLV that this struct represents. [Tlv] will also be implemented on structs. Deriving [TlvEncode] and [TlvDecode] on structs without [Tlv] is not currently supported.

Please note that this library is under active development and the API is not stable.

Example

Here is a quick example of how the library may be used:

use bytes::{Buf, BufMut, Bytes, BytesMut};
use ndn_tlv::{Tlv, TlvEncode, TlvDecode, Result, VarNum, TlvError};

#[derive(Debug, Tlv, PartialEq)]
#[tlv(8)]
struct GenericNameComponent {
    name: Bytes,
}

#[derive(Debug, Tlv, PartialEq)]
#[tlv(1)]
struct ImplicitSha256DigestComponent {
    name: Bytes,
}

#[derive(Debug, Tlv, PartialEq)]
enum NameComponent {
    GenericNameComponent(GenericNameComponent),
    ImplicitSha256DigestComponent(ImplicitSha256DigestComponent),
}

#[derive(Debug, Tlv, PartialEq)]
#[tlv(7)]
struct Name {
    components: Vec<NameComponent>,
}

fn main() {
    let name = Name {
        components: vec![
            NameComponent::GenericNameComponent(GenericNameComponent {
                name: Bytes::from(&b"hello"[..])
            }),
            NameComponent::GenericNameComponent(GenericNameComponent {
                name: Bytes::from(&b"world"[..])
            }),
        ]
    };

    let data = name.encode();
    assert_eq!(data, &[
            7, 14, 8, 5, b'h', b'e', b'l', b'l', b'o',
                   8, 5, b'w', b'o', b'r', b'l', b'd'
        ][..]);
    let decoded = Name::decode(&mut data.clone()).unwrap();
    assert_eq!(decoded, name);
}
Commit count: 0

cargo fmt