// Package renderer provides rendering functionality for ER diagrams package renderer import ( "fmt" "strings" "mermaid-go/pkg/ast" ) // ERRenderer renders ER diagrams back to mermaid syntax type ERRenderer struct{} // NewERRenderer creates a new ER renderer func NewERRenderer() *ERRenderer { return &ERRenderer{} } // Render renders an ER diagram to mermaid syntax func (r *ERRenderer) Render(diagram *ast.ERDiagram) (string, error) { var builder strings.Builder // Start with diagram declaration builder.WriteString("erDiagram\n") // Add title if present if diagram.Title != nil { builder.WriteString(fmt.Sprintf(" title %s\n", *diagram.Title)) } // Note: ERDiagram doesn't have a Direction field in the existing structure // Direction support could be added to the AST if needed // Render entities with attributes for _, entity := range diagram.Entities { if len(entity.Attributes) > 0 { builder.WriteString(" ") builder.WriteString(entity.Name) builder.WriteString(" {\n") for _, attr := range entity.Attributes { builder.WriteString(" ") builder.WriteString(attr.Type) builder.WriteString(" ") builder.WriteString(attr.Name) // Add key if present if attr.Key != nil { builder.WriteString(" ") builder.WriteString(string(*attr.Key)) } // Add comment if present if attr.Comment != nil { builder.WriteString(" \"") builder.WriteString(*attr.Comment) builder.WriteString("\"") } builder.WriteString("\n") } builder.WriteString(" }\n") } } // Render relationships for _, rel := range diagram.Relations { builder.WriteString(" ") builder.WriteString(rel.From) builder.WriteString(" ") builder.WriteString(string(rel.Type)) builder.WriteString(" ") builder.WriteString(rel.To) if rel.Label != nil { builder.WriteString(" : ") if strings.Contains(*rel.Label, " ") { builder.WriteString(fmt.Sprintf("\"%s\"", *rel.Label)) } else { builder.WriteString(*rel.Label) } } builder.WriteString("\n") } return builder.String(), nil }