Files
marka/renderer/renderer.go

54 lines
1.6 KiB
Go

// Package renderer provides functions for rendering Marka templates.
package renderer
import (
"encoding/json"
"fmt"
"git.max-richter.dev/max/marka/registry"
"git.max-richter.dev/max/marka/renderer/encoders"
"git.max-richter.dev/max/marka/template"
"git.max-richter.dev/max/marka/validator"
)
func RenderFile(rawJSON []byte) ([]byte, error) {
// 1) parse json
var data map[string]any
if err := json.Unmarshal(rawJSON, &data); err != nil {
return nil, fmt.Errorf("failed to parse JSON: %w", err)
}
// 2) extract type from "@type" Property
contentType, ok := data["@type"].(string)
if !ok || contentType == "" {
return nil, fmt.Errorf("JSON does not contain a valid '@type' property")
}
// 3) get the template from the registry
templateContent, err := registry.GetTemplate(contentType)
if err != nil {
return nil, fmt.Errorf("could not get template for type '%s': %w", contentType, err)
}
// 4) parse the template with the template package
compiledTemplate, err := template.CompileTemplate(templateContent)
if err != nil {
return nil, fmt.Errorf("failed to compile template for type '%s': %w", contentType, err)
}
// 5) validate JSON against schema
if schemaName, ok := data["@schema"].(string); ok {
if validationErr := validator.ValidateSchema(data, schemaName); validationErr != nil {
return nil, fmt.Errorf("failed to validate schema: %w", validationErr)
}
}
// 6) render the template with the blocks
outputString, err := encoders.Render(data, compiledTemplate)
if err != nil {
return nil, fmt.Errorf("failed to render template: %w", err)
}
return []byte(outputString), nil
}