tl-proto

A collection of traits for working with TL serialization/deserialization.
Example
use tl_proto::{TlRead, TlWrite};
#[derive(TlRead, TlWrite)]
#[tl(size_hint = 32)]
struct HashRef<'tl>(&'tl [u8; 32]);
#[derive(TlRead, TlWrite)]
#[tl(boxed)]
enum PublicKey<'tl> {
#[tl(id = 0x2dbcadd4)]
Aes { key: HashRef<'tl> },
#[tl(id = 0x4813b4c6)]
Ed25519 { key: HashRef<'tl> },
#[tl(id = 0x34ba45cb)]
Overlay { name: &'tl [u8] },
}
#[derive(TlRead, TlWrite)]
#[tl(boxed)]
enum Address<'tl> {
#[tl(id = 0x670da6e7)]
Udp { ip: i32, port: i32 },
#[tl(id = 0xe31d63fa)]
Udp6 { ip: &'tl [u8; 16], port: i32 },
#[tl(id = 0x092b02eb)]
Tunnel {
to: HashRef<'tl>,
pubkey: PublicKey<'tl>,
},
}
fn main() {
let bytes = tl_proto::serialize(&Address::Udp {
ip: 123,
port: 3000,
});
let decoded = tl_proto::deserialize::<Address>(&bytes).unwrap();
assert!(matches!(
decoded,
Address::Udp {
ip: 123,
port: 3000,
}
));
}
Specification
| Type |
Pseudocode |
() |
[] |
i32,u32,i64,u64 |
little_endian(x) |
true |
[0xb5, 0x75, 0x72, 0x99] |
false |
[0x37, 0x97, 0x79, 0xbc] |
[u8; N], N % 4 ≡ 0) |
[…x] |
Vec<u8>, len < 254) |
[len as u8, …x, …padding_to_4(len)] |
Vec<u8>, len ≥ 254) |
[254, …little_endian(x)[0..=2], …x, …padding_to_4(len)] |
Vec<T> |
[…little_endian(len as u32), …map(…x, repr)] |
(T0, … , Tn) |
[…repr(T0), … , …repr(Tn)] |
Option<T> |
{ Some(x) ⇒ repr(x), None ⇒ [] } |
enum { T0, …, Tn } |
{ T0(x) ⇒ […id(T0), …repr(x)], …, Tn(x) ⇒ […id(Tn), …repr(x)] } |