A parser for Telegram's TL (Type Language) schema files.
Turns raw .tl schema text into a structured AST — the foundation of the entire type system.
[dependencies]
layer-tl-parser = "0.1.1"The Telegram API is defined in a custom schema language called TL (Type Language). Every type, constructor, and function in the Telegram protocol is described in .tl files — api.tl for the high-level API, mtproto.tl for the low-level MTProto protocol.
layer-tl-parser reads these schema files and produces a structured AST that can be consumed by code generators (like layer-tl-gen) to produce native Rust types.
A .tl file looks like this:
// A constructor (type definition)
message#9cb490e9 flags:# out:flags.1?true id:int peer_id:Peer message:string = Message;
// A function (RPC call)
messages.sendMessage#545cd15a peer:InputPeer message:string random_id:long = Updates;
// An abstract type
inputPeerEmpty#7f3b18ea = InputPeer;
inputPeerSelf#7da07ec9 = InputPeer;
inputPeerUser#dde8a54c user_id:long access_hash:long = InputPeer;
layer-tl-parser parses all of this into typed Rust structures.
/// A single parsed TL definition (constructor or function)
pub struct Definition {
pub name: String, // e.g. "message"
pub id: Option<u32>, // e.g. 0x9cb490e9 (CRC)
pub params: Vec<Parameter>, // field definitions
pub ty: Type, // return / abstract type
pub category: Category, // Type or Function
}
pub struct Parameter {
pub name: String, // field name
pub ty: ParameterType,
}
// Parameter types cover: bare, boxed, flags, conditional, generic
pub enum ParameterType {
Flags,
Normal { ty: Type, flag: Option<Flag> },
Repeated { params: Vec<Parameter> },
}use layer_tl_parser::{parse_tl_file, tl::Category};
let schema = std::fs::read_to_string("api.tl").unwrap();
let definitions = parse_tl_file(&schema).unwrap();
for def in &definitions {
match def.category {
Category::Type => {
println!("Constructor: {} → {}", def.name, def.ty.name);
}
Category::Function => {
println!("Function: {} → {}", def.name, def.ty.name);
}
}
}
println!("Total definitions: {}", definitions.len());layer-tl-types (generated types)
└── layer-tl-gen (code generator, uses parser)
└── layer-tl-parser ← you are here
Licensed under either of, at your option:
- MIT License — see LICENSE-MIT
- Apache License, Version 2.0 — see LICENSE-APACHE
Ankit Chaubey github.com/ankit-chaubey · ankitchaubey.in · ankitchaubey.dev@gmail.com