feat(dbml): @postgres/@sqlite dialect directives (#19)
Add parseable `@<namespace>[(<target>)]: <args>` directives embedded in DBML.
They are stored losslessly on each object's Metadata, round-trip unchanged
through the DBML writer, and are translated to SQL only by the writer for the
matching dialect.
- models: Directive type + catalog; Metadata map added to Column and Index
- dbml reader: parse and attach directives at database/table/column/index
level; line-numbered errors; repeatable by default with singleton duplicate
detection. Fixes a preexisting bug where an `indexes {}` closing brace ended
the table early, dropping trailing Note: and directive lines.
- dbml writer: re-emit directives at their location; idempotent output
- pgsql writer: PARTITION BY / INHERITS / WITH / TABLESPACE (table),
STORAGE / COMPRESSION / identity (column), WITH / TABLESPACE (index)
- sqlite writer: WITHOUT ROWID / STRICT (table), COLLATE (column)
- --strict-directives flag on ReaderOptions and WriterOptions
- docs/DBML_DIRECTIVES.md + reader/writer READMEs
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ss2MY5J11cRGwEz86ZXk7d
This commit is contained in:
@@ -0,0 +1,23 @@
|
||||
package dbml
|
||||
|
||||
import (
|
||||
"git.warky.dev/wdevs/relspecgo/pkg/models"
|
||||
)
|
||||
|
||||
// directiveLines renders every dialect directive stored in meta back to its DBML
|
||||
// source form, one line per directive, each prefixed with indent. When target is
|
||||
// non-empty it is emitted as the "(column)" target, e.g.
|
||||
// " @postgres(id): identity always". Order is deterministic (see
|
||||
// models.GetDirectives).
|
||||
func directiveLines(meta map[string]any, indent, target string) []string {
|
||||
directives := models.GetDirectives(meta)
|
||||
if len(directives) == 0 {
|
||||
return nil
|
||||
}
|
||||
|
||||
lines := make([]string, 0, len(directives))
|
||||
for _, d := range directives {
|
||||
lines = append(lines, indent+models.FormatDirectiveLine(d, target))
|
||||
}
|
||||
return lines
|
||||
}
|
||||
Reference in New Issue
Block a user