er.go 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. // Package renderer provides rendering functionality for ER diagrams
  2. package renderer
  3. import (
  4. "fmt"
  5. "strings"
  6. "mermaid-go/pkg/ast"
  7. )
  8. // ERRenderer renders ER diagrams back to mermaid syntax
  9. type ERRenderer struct{}
  10. // NewERRenderer creates a new ER renderer
  11. func NewERRenderer() *ERRenderer {
  12. return &ERRenderer{}
  13. }
  14. // Render renders an ER diagram to mermaid syntax
  15. func (r *ERRenderer) Render(diagram *ast.ERDiagram) (string, error) {
  16. var builder strings.Builder
  17. // Start with diagram declaration
  18. builder.WriteString("erDiagram\n")
  19. // Add title if present
  20. if diagram.Title != nil {
  21. builder.WriteString(fmt.Sprintf(" title %s\n", *diagram.Title))
  22. }
  23. // Note: ERDiagram doesn't have a Direction field in the existing structure
  24. // Direction support could be added to the AST if needed
  25. // Render entities with attributes
  26. for _, entity := range diagram.Entities {
  27. if len(entity.Attributes) > 0 {
  28. builder.WriteString(" ")
  29. builder.WriteString(entity.Name)
  30. builder.WriteString(" {\n")
  31. for _, attr := range entity.Attributes {
  32. builder.WriteString(" ")
  33. builder.WriteString(attr.Type)
  34. builder.WriteString(" ")
  35. builder.WriteString(attr.Name)
  36. // Add key if present
  37. if attr.Key != nil {
  38. builder.WriteString(" ")
  39. builder.WriteString(string(*attr.Key))
  40. }
  41. // Add comment if present
  42. if attr.Comment != nil {
  43. builder.WriteString(" \"")
  44. builder.WriteString(*attr.Comment)
  45. builder.WriteString("\"")
  46. }
  47. builder.WriteString("\n")
  48. }
  49. builder.WriteString(" }\n")
  50. }
  51. }
  52. // Render relationships
  53. for _, rel := range diagram.Relations {
  54. builder.WriteString(" ")
  55. builder.WriteString(rel.From)
  56. builder.WriteString(" ")
  57. builder.WriteString(string(rel.Type))
  58. builder.WriteString(" ")
  59. builder.WriteString(rel.To)
  60. if rel.Label != nil {
  61. builder.WriteString(" : ")
  62. if strings.Contains(*rel.Label, " ") {
  63. builder.WriteString(fmt.Sprintf("\"%s\"", *rel.Label))
  64. } else {
  65. builder.WriteString(*rel.Label)
  66. }
  67. }
  68. builder.WriteString("\n")
  69. }
  70. return builder.String(), nil
  71. }