Custom Tags¶
You can create custom Leaf tags using the TagRenderer
protocol.
To demonstrate this, let's take a look at creating a custom tag #now
that prints the current timestamp. The tag will also support a single, optional parameter for specifying the date format.
Tag Renderer¶
First create a class called NowTag
and conform it to TagRenderer
.
final class NowTag: TagRenderer { init() { } func render(tag: TagContext) throws -> EventLoopFuture<TemplateData> { ... } }
Now let's implement the render(tag:)
method. The TagContext
context passed to this method has everything we should need.
let formatter = DateFormatter() switch tag.parameters.count { case 0: formatter.dateFormat = "yyyy-MM-dd HH:mm:ss" case 1: guard let string = tag.parameters[0].string else { throw ... } formatter.dateFormat = string default: throw ... } let string = formatter.string(from: .init()) return tag.container.future(.string(string))
Configure Tag¶
Now that we've implemented NowTag
, we just need to configure it. You can configure any TagRenderer
like this--even if they come from a separate package.
services.register { container -> LeafTagConfig in var config = LeafTagConfig.default() config.use(NowTag(), as: "now") return config }
And that's it! We can now use our custom tag in Leaf.
The time is #now()