TLang.Leaf
TLang.Leaf is the API for traversing the model tree at runtime. When you need to iterate dynamically over all sets or access nodes whose names are not known at compile time, Leaf is the right tool.
use TLang.Leaf
Leaf.model()
Returns the root model node — the top-level object containing all sets.
let model = Leaf.model()
Leaf.get()
Returns a child node by name.
let model = Leaf.model()
let user = Leaf.get(model, "User") // the User set
let attrs = Leaf.get(user, "attrs") // attributes of User
let pkgNode = Leaf.get(attrs, "pkg") // the pkg attribute node
Leaf.keys()
Returns a List of all child names. Use this to iterate over all sets.
let model = Leaf.model()
let keys = Leaf.keys(model) // ["User", "Product", "Order", ...]
for (k in keys) {
let entry = Leaf.get(model, k)
Terminal.println(k)
}
Leaf.has()
Checks whether a child with the given name exists.
if (Leaf.has(model, "Order")) {
let order = Leaf.get(model, "Order")
// process order...
}
Direct Dot Access
When the set name is known at compile time, dot notation is shorter and clearer. Leaf API is only needed for dynamic traversal.
// Preferred when name is known
let pkg = User.pkg
let cls = User.cls
// Use Leaf for dynamic access
let model = Leaf.model()
for (k in Leaf.keys(model)) {
let entry = Leaf.get(model, k)
let pkg = entry.pkg // dot access on a Leaf node
let cls = entry.cls
}
Example — Generate Files for Every Set
use TLang.Leaf
use TLang.Generator
use TLang.File
use TLang.Terminal
use KotlinGen as kotlin
lang [kotlin] entity(pkg: String, cls: String) {
pkg $${pkg}
impl[data class] $${cls}(
val id: Long,
val name: String
)
}
model {
set User { pkg: "com.example", cls: "User" }
set Product { pkg: "com.example", cls: "Product" }
set Order { pkg: "com.example", cls: "Order" }
}
func main(): String {
let model = Leaf.model()
let keys = Leaf.keys(model)
for (k in keys) {
let entry = Leaf.get(model, k)
let pkg = entry.pkg
let cls = entry.cls
let code = Generator.generate(entity(pkg, cls))
File.write("output/" + cls + ".kt", code, true)
Terminal.println(" → " + cls + ".kt")
}
return "done"
}