architecture.go 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. // Package renderer provides Architecture rendering
  2. package renderer
  3. import (
  4. "fmt"
  5. "strings"
  6. "mermaid-go/pkg/ast"
  7. )
  8. // ArchitectureRenderer implements Architecture rendering
  9. type ArchitectureRenderer struct{}
  10. // NewArchitectureRenderer creates a new Architecture renderer
  11. func NewArchitectureRenderer() *ArchitectureRenderer {
  12. return &ArchitectureRenderer{}
  13. }
  14. // Render renders an Architecture diagram to mermaid syntax
  15. func (r *ArchitectureRenderer) Render(diagram *ast.ArchitectureDiagram) (string, error) {
  16. var result strings.Builder
  17. // Start with architecture declaration
  18. result.WriteString("architecture\n")
  19. // Add title if present
  20. if diagram.Title != nil {
  21. result.WriteString(fmt.Sprintf(" title %s\n", *diagram.Title))
  22. }
  23. // Render groups
  24. for _, group := range diagram.Groups {
  25. result.WriteString(fmt.Sprintf(" group %s", group.ID))
  26. if group.Title != nil {
  27. result.WriteString(fmt.Sprintf("[%s]", *group.Title))
  28. }
  29. if group.In != nil {
  30. result.WriteString(fmt.Sprintf(" in %s", *group.In))
  31. }
  32. result.WriteString("\n")
  33. }
  34. // Render services
  35. for _, service := range diagram.Services {
  36. result.WriteString(fmt.Sprintf(" service %s", service.ID))
  37. if service.Title != nil {
  38. result.WriteString(fmt.Sprintf("[%s]", *service.Title))
  39. }
  40. if service.In != nil {
  41. result.WriteString(fmt.Sprintf(" in %s", *service.In))
  42. }
  43. result.WriteString("\n")
  44. }
  45. // Render edges
  46. for _, edge := range diagram.Edges {
  47. result.WriteString(fmt.Sprintf(" %s %s--%s %s",
  48. edge.LhsID,
  49. string(edge.LhsDir),
  50. string(edge.RhsDir),
  51. edge.RhsID))
  52. if edge.Title != nil {
  53. result.WriteString(fmt.Sprintf(" : %s", *edge.Title))
  54. }
  55. result.WriteString("\n")
  56. }
  57. return result.String(), nil
  58. }