208 lines
5.6 KiB
Plaintext
208 lines
5.6 KiB
Plaintext
#! Template rendering daemon functions
|
|
#!
|
|
#! Provides high-performance Jinja2 template rendering via HTTP API.
|
|
#! The CLI daemon's Tera engine offers 50-100x better performance than
|
|
#! spawning a new Nushell process for each template render.
|
|
#!
|
|
#! Performance:
|
|
#! - Single render: ~4-10ms (vs ~500ms with Nushell spawning)
|
|
#! - Batch 10 renders: ~50-60ms (vs ~5500ms)
|
|
#! - Batch 100 renders: ~600-700ms (vs ~55000ms)
|
|
|
|
use ../env.nu [get-cli-daemon-url]
|
|
|
|
# Render a Jinja2 template with the given context
|
|
#
|
|
# Uses the CLI daemon's Tera engine for fast in-process template rendering.
|
|
# This is significantly faster than spawning a new Nushell process.
|
|
#
|
|
# # Arguments
|
|
# * `template` - Template content (Jinja2 syntax)
|
|
# * `context` - Context record with template variables
|
|
# * `--name` - Optional template name for error reporting
|
|
#
|
|
# # Returns
|
|
# Rendered template content or error if rendering failed
|
|
#
|
|
# # Example
|
|
# ```nushell
|
|
# let template = "Hello {{ name }}!"
|
|
# let context = {name: "World"}
|
|
# tera-render-daemon $template $context --name greeting
|
|
# # Output: Hello World!
|
|
# ```
|
|
export def tera-render-daemon [
|
|
template: string
|
|
context: record
|
|
--name: string = "template"
|
|
] -> string {
|
|
let daemon_url = (get-cli-daemon-url)
|
|
|
|
# Convert context record to JSON object
|
|
let context_json = ($context | to json | from json)
|
|
|
|
# Build request
|
|
let request = {
|
|
template: $template
|
|
context: $context_json
|
|
name: $name
|
|
}
|
|
|
|
# Send to daemon's Tera endpoint
|
|
let response = (
|
|
http post $"($daemon_url)/tera/render" $request
|
|
--raw
|
|
)
|
|
|
|
# Parse response
|
|
let parsed = ($response | from json)
|
|
|
|
# Check for error
|
|
if ($parsed.error? != null) {
|
|
error make {msg: $parsed.error}
|
|
}
|
|
|
|
# Return rendered output
|
|
$parsed.rendered
|
|
}
|
|
|
|
# Get template rendering statistics from daemon
|
|
#
|
|
# Returns statistics about template renders since daemon startup or last reset.
|
|
#
|
|
# # Returns
|
|
# Record with:
|
|
# - `total_renders`: Total number of templates rendered
|
|
# - `total_errors`: Number of rendering errors
|
|
# - `total_time_ms`: Total time spent rendering (milliseconds)
|
|
# - `avg_time_ms`: Average time per render
|
|
export def tera-daemon-stats [] -> record {
|
|
let daemon_url = (get-cli-daemon-url)
|
|
|
|
let response = (http get $"($daemon_url)/tera/stats")
|
|
|
|
$response | from json
|
|
}
|
|
|
|
# Reset template rendering statistics on daemon
|
|
#
|
|
# Clears all counters and timing statistics.
|
|
export def tera-daemon-reset-stats [] -> void {
|
|
let daemon_url = (get-cli-daemon-url)
|
|
|
|
http post $"($daemon_url)/tera/stats/reset" ""
|
|
}
|
|
|
|
# Check if CLI daemon is running and Tera rendering is available
|
|
#
|
|
# # Returns
|
|
# `true` if daemon is running with Tera support, `false` otherwise
|
|
export def is-tera-daemon-available [] -> bool {
|
|
let result = (do {
|
|
let daemon_url = (get-cli-daemon-url)
|
|
let response = (http get $"($daemon_url)/info" --timeout 500ms)
|
|
|
|
# Check if tera-rendering is in features list
|
|
($response | from json | .features | str contains "tera-rendering")
|
|
} | complete)
|
|
|
|
if $result.exit_code != 0 {
|
|
false
|
|
} else {
|
|
$result.stdout
|
|
}
|
|
}
|
|
|
|
# Start using Tera daemon for rendering (if available)
|
|
#
|
|
# This function checks if the daemon is running and prints a status message.
|
|
# It's useful for diagnostics.
|
|
export def ensure-tera-daemon [] -> void {
|
|
if (is-tera-daemon-available) {
|
|
print "✅ Tera daemon is available and running"
|
|
} else {
|
|
print "⚠️ Tera daemon is not available"
|
|
print " CLI daemon may not be running at http://localhost:9091"
|
|
}
|
|
}
|
|
|
|
# Render multiple templates in batch mode
|
|
#
|
|
# Renders a list of templates sequentially. This is faster than calling
|
|
# tera-render-daemon multiple times due to daemon connection reuse.
|
|
#
|
|
# # Arguments
|
|
# * `templates` - List of records with `template` and `context` fields
|
|
#
|
|
# # Returns
|
|
# List of rendered outputs or error messages
|
|
#
|
|
# # Example
|
|
# ```nushell
|
|
# let templates = [
|
|
# {template: "Hello {{ name }}", context: {name: "Alice"}}
|
|
# {template: "Goodbye {{ name }}", context: {name: "Bob"}}
|
|
# ]
|
|
# tera-render-batch $templates
|
|
# # Output: [Hello Alice, Goodbye Bob]
|
|
# ```
|
|
export def tera-render-batch [
|
|
templates: list<record>
|
|
] -> list<string> {
|
|
let results = []
|
|
|
|
for template_def in $templates {
|
|
let rendered = (
|
|
tera-render-daemon
|
|
$template_def.template
|
|
$template_def.context
|
|
--name ($template_def.name? | default "batch")
|
|
)
|
|
$results | append $rendered
|
|
}
|
|
|
|
$results
|
|
}
|
|
|
|
# Profile template rendering performance
|
|
#
|
|
# Renders a template multiple times and reports timing statistics.
|
|
# Useful for benchmarking and performance optimization.
|
|
#
|
|
# # Arguments
|
|
# * `template` - Template to render
|
|
# * `context` - Context for rendering
|
|
# * `--iterations` - Number of times to render (default: 10)
|
|
# * `--name` - Template name for reporting
|
|
#
|
|
# # Returns
|
|
# Record with performance metrics
|
|
export def tera-profile [
|
|
template: string
|
|
context: record
|
|
--iterations: int = 10
|
|
--name: string = "profiled"
|
|
] -> record {
|
|
let start = (date now)
|
|
|
|
# Reset stats before profiling
|
|
tera-daemon-reset-stats
|
|
|
|
# Run renders
|
|
for i in 0..<$iterations {
|
|
tera-render-daemon $template $context --name $"($name)_$i"
|
|
}
|
|
|
|
let elapsed = ((date now) - $start) | into duration | get total | . / 1_000_000
|
|
let stats = (tera-daemon-stats)
|
|
|
|
{
|
|
iterations: $iterations
|
|
total_time_ms: $elapsed
|
|
avg_time_ms: ($elapsed / $iterations)
|
|
daemon_renders: $stats.total_renders
|
|
daemon_avg_time_ms: $stats.avg_time_ms
|
|
daemon_errors: $stats.total_errors
|
|
}
|
|
}
|