v0.9.0
What's New
AnyDataMarshaler — render arbitrary data, not just TableData
New RenderAnyData() dispatch for rendering any Go value. JSON, YAML, and TOML register handlers automatically.
output.RenderAnyData(myStruct, output.FormatJSON, output.RenderOptions{})All 16 formats now dispatch via RenderTableData()
D2, DOT, Mermaid, and PlantUML now register TableDataMarshaler via init(). Previously only 10 formats were registered.
Generic formatRegistry[T]
Thread-safe generic registry replaces 3 separate mutex+map patterns. Same formatRegistry[T] backs shape capabilities, table-data marshalers, and any-data marshalers.
AddRowChecked
err := data.AddRowChecked(row) // returns ErrColumnMismatch if column count differs from headersNOM event constants
nom.EventWorkflowStarted // instead of "workflow.started"
nom.EventActivityCompleted // instead of "activity.completed"What's Changed
- Added:
RenderAnyData,RegisterAnyDataMarshaler,RegisteredAnyDataFormats,RegisteredTableDataFormats - Added:
TableData.AddRowChecked()with column-count validation - Added:
nom.Event*typed string constants - Added: D2, DOT, Mermaid, PlantUML register as
TableDataMarshaler - Changed: Generic
formatRegistry[T]replaces 3 mutex+map patterns - Changed:
dt.Build()errors propagated instead of silently discarded - Changed: NOM timing cache async save errors now logged
- Deprecated:
delimited.MarshalTSV(data any)→ useMarshalTSVFromTableData - Deprecated:
graph.NewGraphNodeID/NewGraphNodeLabel→ useoutput.NewBrandedID - Deprecated:
nom.ParseActivityID/ParseWorkflowID→ use direct type conversion
Full Changelog: v0.8.0...v0.9.0