render

package
v0.25.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jun 17, 2026 License: MIT Imports: 12 Imported by: 4

Documentation

Overview

Package render hosts renderer interfaces and registry helpers, matching the extensibility goals detailed in go-form-gen.md:137-159 and go-form-gen.md:223-239. Concrete renderers live under pkg/renderers.

Index

Constants

This section is empty.

Variables

View Source
var ErrMissingTranslator = errors.New("render: missing translator")

Functions

func ApplySubset

func ApplySubset(form *model.FormModel, subset FieldSubset)

ApplySubset removes fields that do not match the supplied subset filters. This compatibility wrapper delegates to the renderer-free model helper.

func LocalizeFormModel added in v0.5.0

func LocalizeFormModel(form *model.FormModel, opts RenderOptions)

LocalizeFormModel mutates the supplied form model in place, translating any configured `*Key` hints in the UI schema into their localized string values.

This is best-effort: malformed metadata payloads are ignored and translation failures are routed through opts.OnMissing.

func MergeFormErrors

func MergeFormErrors(existing []string, extras ...string) []string

MergeFormErrors concatenates and normalises multiple form-level error slices, trimming whitespace and removing duplicates while preserving order.

func MergeHiddenFields

func MergeHiddenFields(base map[string]string, fields ...HiddenField) map[string]string

MergeHiddenFields returns a copy of base with the provided fields applied. Empty names are ignored; later fields win on name collisions.

func RedactSensitiveDefaults added in v0.21.0

func RedactSensitiveDefaults(form *model.FormModel, includeSensitive bool)

RedactSensitiveDefaults removes defaults from sensitive fields unless the caller explicitly opted into exposing them.

func RedactSensitiveValues added in v0.21.0

func RedactSensitiveValues(form model.FormModel, values map[string]any, includeSensitive bool) map[string]any

RedactSensitiveValues returns a copy of values with entries matching sensitive fields removed. It accepts nested maps and dotted/bracketed field names.

func TemplateI18nFuncs added in v0.5.0

func TemplateI18nFuncs(t Translator, cfg TemplateI18nConfig) map[string]any

TemplateI18nFuncs returns a map suitable for injecting into go-template engines (e.g. via vanilla.WithTemplateFuncs / preact.WithTemplateFuncs).

The main helper signature is:

translate(localeSrc, key, ...args) string

Where localeSrc can be a string locale (e.g. "en-US") or a map/struct that contains a locale value under cfg.LocaleKey.

Types

type ChromeClasses added in v0.17.0

type ChromeClasses struct {
	// Form overrides the CSS class attribute on the root <form> element.
	Form string
	// Header overrides the header wrapping title/subtitle chrome.
	Header string
	// Section overrides the section wrapper used for grouped fields.
	Section string
	// Fieldset overrides the section wrapper when section.fieldset is true.
	Fieldset string
	// Actions overrides the action row container class list.
	Actions string
	// Errors overrides the top-of-form error summary class list.
	Errors string
	// Grid overrides the grid container used for field layouts.
	Grid string
}

ChromeClasses overrides high-level class lists in renderer templates. When a field is non-empty the value replaces the renderer's default classes entirely.

type ErrorMapping

type ErrorMapping struct {
	Fields map[string][]string
	Form   []string
}

ErrorMapping splits a go-errors compatible payload into field-level and form-level messages keyed by the dotted field paths used throughout the render pipeline.

func MapErrorPayload

func MapErrorPayload(form model.FormModel, payload map[string][]string) ErrorMapping

MapErrorPayload normalises server error payloads (including go-errors style JSON pointer paths) into dotted field identifiers that renderers can consume. Unknown paths are treated as form-level errors so messages are not lost.

type FieldSubset

type FieldSubset = model.FieldSubset

FieldSubset describes the allowed groups, tags, or sections for partial rendering. This is a compatibility alias to the renderer-free model type.

type HiddenField

type HiddenField struct {
	Name  string `json:"name"`
	Value string `json:"value"`
}

HiddenField represents a hidden form input emitted alongside the visible schema. Use the helpers (CSRFToken, AuthToken, VersionField) to add common fields without repeating boilerplate.

func AuthToken

func AuthToken(name, token string) HiddenField

AuthToken constructs a hidden field carrying an authentication token or session hint.

func CSRFToken

func CSRFToken(name, token string) HiddenField

CSRFToken constructs a hidden field carrying the provided token. Callers supply the input name to match their backend expectations (for example, "_csrf" or "csrf_token").

func Hidden

func Hidden(name string, value any) HiddenField

Hidden returns a HiddenField for an arbitrary name/value pair.

func SortedHiddenFields

func SortedHiddenFields(fields map[string]string) []HiddenField

SortedHiddenFields normalises and sorts hidden fields for deterministic rendering. Empty names are dropped.

func VersionField

func VersionField(name string, version any) HiddenField

VersionField constructs a hidden field used for optimistic locking or version-aware submissions (for example, "if-match" or "version").

type MissingTranslationHandler added in v0.5.0

type MissingTranslationHandler func(locale, key string, args []any, err error) string

MissingTranslationHandler decides what string should be emitted when a translation cannot be resolved.

Convention: when go-formgen performs model localization it passes a single map argument in args containing { "default": <existing text> }.

type Registry

type Registry struct {
	// contains filtered or unexported fields
}

Registry stores renderers by name, providing discovery and duplication safeguards. Implementations can embed or wrap this for dependency injection.

func NewRegistry

func NewRegistry() *Registry

NewRegistry creates an empty registry instance.

func (*Registry) Get

func (r *Registry) Get(name string) (Renderer, error)

Get retrieves a renderer by name.

func (*Registry) Has

func (r *Registry) Has(name string) bool

Has reports whether a renderer is registered.

func (*Registry) List

func (r *Registry) List() []string

List returns a sorted list of renderer names.

func (*Registry) MustGet

func (r *Registry) MustGet(name string) Renderer

MustGet panics if the renderer is missing.

func (*Registry) MustRegister

func (r *Registry) MustRegister(renderer Renderer)

MustRegister panics on registration failure. Useful for init-time wiring.

func (*Registry) Register

func (r *Registry) Register(renderer Renderer) error

Register adds a renderer by its Name(). Duplicate names return an error.

type RenderMode added in v0.21.0

type RenderMode string

RenderMode selects how much structural markup a renderer should emit.

const (
	// RenderModeDocument preserves each renderer's historical full output.
	RenderModeDocument RenderMode = "document"
	// RenderModeForm emits a form root without page-level assumptions.
	RenderModeForm RenderMode = "form"
	// RenderModeFields emits controls without a <form> wrapper.
	RenderModeFields RenderMode = "fields"
)

type RenderOptions

type RenderOptions struct {
	// RenderMode selects document/current, form-only, or fields-only output.
	// The zero value preserves the renderer's historical document behavior.
	RenderMode RenderMode
	// Method overrides the HTTP method declared by the form model. Renderers are
	// responsible for translating unsupported verbs (PATCH/PUT/DELETE) into
	// browser-friendly POST submissions plus a hidden _method input when needed.
	Method string
	// Subset restricts rendering to fields whose group, tags, or section match
	// the supplied tokens. Empty subsets leave the form unchanged.
	Subset FieldSubset
	// Values pre-populates rendered controls using dotted field paths (e.g.
	// "author.email"). Values may be wrapped in ValueWithProvenance to attach
	// provenance labels or lock fields as readonly/disabled. Renderers can
	// decide how to handle nested values or collections for advanced components
	// such as chips/typeahead controls.
	Values map[string]any
	// Errors surfaces server-side validation feedback keyed by field path. The
	// vanilla renderer maps these into inline chrome plus data-validation
	// attributes so the runtime and assistive tech can reflect the state without
	// waiting for client-side validation.
	Errors map[string][]string
	// FormErrors carries non-field-specific validation messages that should
	// render at the top of the form. These often come from request-scoped or
	// cross-field validation in the backend.
	FormErrors []string
	// HiddenFields injects name/value pairs as hidden inputs, useful for CSRF
	// tokens, auth/session hints, optimistic locking versions, or other
	// submission metadata that should travel with the form without showing up in
	// the visible schema.
	HiddenFields map[string]string
	// Locale selects the locale used by render-time localization helpers.
	Locale string
	// Translator enables model and template-level localization.
	Translator Translator
	// OnMissing customizes what string is used when a translation is missing.
	OnMissing MissingTranslationHandler
	// Theme passes renderer configuration derived by an explicit theme helper so
	// renderers can resolve partials, assets, and tokens consistently.
	Theme *ThemeConfig
	// VisibilityContext carries evaluator-specific inputs such as current form
	// values or feature flags used to decide whether a field should render.
	VisibilityContext visibility.Context
	// TopPadding controls how many leading newlines renderers emit before the
	// root form markup when no external stylesheets or inline styles are
	// present. A zero value allows the renderer to apply its default.
	TopPadding int
	// OmitAssets instructs renderers to skip emitting <link>, <style>, and
	// <script> tags. This is useful for rendering partial forms (e.g., modal
	// bodies) that will be embedded in a page where the parent already supplies
	// these assets.
	OmitAssets bool
	// StyleMode selects default, minimal, or unstyled vanilla output. Other
	// renderers may ignore this field when it does not apply.
	StyleMode StyleMode
	// IncludeSensitiveDefaults allows descriptor and browser renderers to emit
	// defaults for fields marked Sensitive. The default is to redact them.
	IncludeSensitiveDefaults bool
	// ChromeClasses overrides high-level CSS class lists in renderer templates.
	// When nil or empty, renderer defaults are used.
	ChromeClasses *ChromeClasses
}

RenderOptions describe per-request data that renderers can use to customise their output without mutating the form model pipeline.

type Renderer

type Renderer interface {
	Name() string
	ContentType() string
	Render(ctx context.Context, model model.FormModel, options RenderOptions) ([]byte, error)
}

Renderer converts a FormModel into a byte representation (HTML, JSX, etc.).

type StyleMode added in v0.21.0

type StyleMode string

StyleMode controls how much default visual styling vanilla rendering emits.

const (
	StyleModeDefault  StyleMode = "default"
	StyleModeMinimal  StyleMode = "minimal"
	StyleModeUnstyled StyleMode = "unstyled"
)

type TemplateI18nConfig added in v0.5.0

type TemplateI18nConfig struct {
	// LocaleKey selects the field/key used to infer locale from template data
	// when callers pass a struct or map instead of a raw string.
	LocaleKey string
	// FuncName customizes the translator helper name (defaults to "translate").
	FuncName string
	// OnMissing controls the string returned when a translation is missing.
	OnMissing MissingTranslationHandler
}

TemplateI18nConfig configures template-level translation helpers.

type ThemeConfig added in v0.21.0

type ThemeConfig struct {
	Theme    string
	Variant  string
	Partials map[string]string
	Tokens   map[string]string
	CSSVars  map[string]string
	AssetURL func(string) string
}

ThemeConfig passes renderer configuration derived by an opt-in theme integration. It intentionally mirrors the fields renderers need without forcing the headless orchestrator or render package to import go-theme.

type Translator added in v0.5.0

type Translator interface {
	Translate(locale, key string, args ...any) (string, error)
}

Translator resolves a string for a given locale and message key. It matches github.com/goliatone/go-i18n's Translator interface so downstream projects can pass that implementation without introducing a hard dependency.

type ValueWithProvenance

type ValueWithProvenance struct {
	Value      any
	Provenance string
	Readonly   bool
	Disabled   bool
}

ValueWithProvenance attaches optional provenance metadata to a prefilled value. Renderers can surface the provenance label and enforce readonly or disabled state when provided.

func PrefillValue

func PrefillValue(value any, provenance string) ValueWithProvenance

PrefillValue is a convenience helper for constructing ValueWithProvenance entries when the caller only needs to specify the value and provenance label.

Directories

Path Synopsis
Package template defines renderer-agnostic template interfaces and adapters.
Package template defines renderer-agnostic template interfaces and adapters.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL