Build-time Rust code generator for Telegram's TL schema.
From TL AST to idiomatic Rust structs, enums, and traits — automatically.
[build-dependencies]
layer-tl-gen = "0.1.1"layer-tl-gen takes a parsed TL AST (from layer-tl-parser) and generates complete, idiomatic Rust source code — structs for constructors, enums for abstract types, and trait implementations for functions.
It runs at build time via build.rs, so the generated code is always in sync with the schema — no manual updates needed.
For every TL definition in the schema, layer-tl-gen produces:
peerUser#9db1bc6d user_id:long = Peer;// generated in types module
pub struct PeerUser {
pub user_id: i64,
}
impl Serializable for PeerUser { ... }
impl Deserializable for PeerUser { ... }peerUser = Peer;
peerChat = Peer;
peerChannel = Peer;// generated in enums module
pub enum Peer {
User(PeerUser),
Chat(PeerChat),
Channel(PeerChannel),
}
impl Deserializable for Peer { ... } // dispatches on CRC32 idmessages.sendMessage#... peer:InputPeer message:string ... = Updates;// generated in functions::messages module
pub struct SendMessage {
pub peer: enums::InputPeer,
pub message: String,
// ...
}
impl RemoteCall for SendMessage {
type Return = enums::Updates;
}
impl Serializable for SendMessage { ... }// layer-tl-types/build.rs
use layer_tl_gen::generate;
fn main() {
let out_dir = std::env::var("OUT_DIR").unwrap();
generate(
"tl/api.tl",
&format!("{out_dir}/generated_api.rs"),
layer_tl_gen::Config {
impl_debug: true,
impl_from_type: true,
impl_from_enum: true,
impl_serde: false,
name_for_id: false,
},
).expect("TL code generation failed");
}pub struct Config {
/// Generate #[derive(Debug)] on all types
pub impl_debug: bool,
/// Generate From<types::T> for enums::E
pub impl_from_type: bool,
/// Generate TryFrom<enums::E> for types::T
pub impl_from_enum: bool,
/// Generate serde::Serialize / Deserialize
pub impl_serde: bool,
/// Generate name_for_id(u32) -> Option<&'static str>
pub name_for_id: bool,
}layer-tl-types (consumes the generated code)
└── layer-tl-gen ← you are here (generates at build time)
└── layer-tl-parser (parses the .tl schema)
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