layer-tl-gen 0.2.2

Build-time code generator: Telegram TL schema → Rust source
Documentation

⚙️ layer-tl-gen

Build-time Rust code generator for Telegram's TL schema.

Crates.io License: MIT OR Apache-2.0 Rust

From TL AST to idiomatic Rust structs, enums, and traits — automatically.


📦 Installation

[build-dependencies]
layer-tl-gen = "0.1.1"

✨ What It Does

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.


🏗️ What Gets Generated

For every TL definition in the schema, layer-tl-gen produces:

Constructor → Rust struct

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 { ... }

Abstract type → Rust enum

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 id

Function → RemoteCall impl

messages.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 { ... }

💡 Usage in build.rs

// 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");
}

⚙️ Config Options

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,
}

🔗 Part of the layer stack

layer-tl-types  (consumes the generated code)
└── layer-tl-gen    ← you are here  (generates at build time)
    └── layer-tl-parser (parses the .tl schema)

📄 License

Licensed under either of, at your option:


👤 Author

Ankit Chaubey github.com/ankit-chaubey · ankitchaubey.in · ankitchaubey.dev@gmail.com

📦 github.com/ankit-chaubey/layer