- Page: README, Leaf, Stencil, swift-html, Swift Language (organic), Template Syntax
- Section: Resources
Service Provider
public final class StencilProvider: Provider {
/// Creates a new `StencilProvider`.
public init() {}
static let stencilPathStr = DirectoryConfig.detect().workDir + "Resources/Stencil/"
static let stencilPath = Path(stencilPathStr)
static let loader: Loader = FileSystemLoader(paths: [stencilPath])
/// See `Provider`.
public func register(_ services: inout Services) throws {
services.register([ViewRenderer.self]) {
container -> StencilRenderer in
return try StencilRenderer.init(using: container)
}
}
/// See `Provider`.
public func didBoot(_ container: Container) throws -> Future<Void> {
return .done(on: container)
}
}View Renderer Service
A view render service which async dispatch was added for Stencil.
public final class StencilRenderer: Service {
/// The event loop this renderer will use to read files
private let container: Container
/// Environment: template loader
private let stencilEnvironment: Stencil.Environment
init(using container: Container) throws {
let directoryConfig = DirectoryConfig.detect()
let stencilPathStr = directoryConfig.workDir + "Resources/Stencil/"
let stencilPath = Path(stencilPathStr)
let loader: Loader = FileSystemLoader(paths: [stencilPath])
self.stencilEnvironment = Stencil.Environment(loader: loader)
self.container = container
}
public func render(
_ path: String, // relative path to a Stencil template file
_ context: [AnyHashable : Any]
)
-> Future<View> {
let promiseView: Promise<View> = container.eventLoop.newPromise(View.self)
DispatchQueue.global().async {
// () -> Void in
do {
let rendered: String = try self.stencilEnvironment.renderTemplate(
name: path, // file path
context: context as? [String : Any]
)
let renderedData = Data(rendered.utf8)
let view: View = View(data:renderedData)
return promiseView.succeed(result: view)
}
catch let err {
promiseView.fail(error: err)
}
}
return promiseView.futureResult // Future<View>
}
}Update Swift Package Manager Installation Example to include 4.2 example.
// swift-tools-version:4.2
import PackageDescription
let package = Package(
name: "MyApplication",
dependencies: [
.package(url: "https://github.com/stencilproject/Stencil.git", from: "0.13.1"),
]
)