// Package renderer provides Architecture rendering package renderer import ( "fmt" "strings" "mermaid-go/pkg/ast" ) // ArchitectureRenderer implements Architecture rendering type ArchitectureRenderer struct{} // NewArchitectureRenderer creates a new Architecture renderer func NewArchitectureRenderer() *ArchitectureRenderer { return &ArchitectureRenderer{} } // Render renders an Architecture diagram to mermaid syntax func (r *ArchitectureRenderer) Render(diagram *ast.ArchitectureDiagram) (string, error) { var result strings.Builder // Start with architecture declaration result.WriteString("architecture\n") // Add title if present if diagram.Title != nil { result.WriteString(fmt.Sprintf(" title %s\n", *diagram.Title)) } // Render groups for _, group := range diagram.Groups { result.WriteString(fmt.Sprintf(" group %s", group.ID)) if group.Title != nil { result.WriteString(fmt.Sprintf("[%s]", *group.Title)) } if group.In != nil { result.WriteString(fmt.Sprintf(" in %s", *group.In)) } result.WriteString("\n") } // Render services for _, service := range diagram.Services { result.WriteString(fmt.Sprintf(" service %s", service.ID)) if service.Title != nil { result.WriteString(fmt.Sprintf("[%s]", *service.Title)) } if service.In != nil { result.WriteString(fmt.Sprintf(" in %s", *service.In)) } result.WriteString("\n") } // Render edges for _, edge := range diagram.Edges { result.WriteString(fmt.Sprintf(" %s %s--%s %s", edge.LhsID, string(edge.LhsDir), string(edge.RhsDir), edge.RhsID)) if edge.Title != nil { result.WriteString(fmt.Sprintf(" : %s", *edge.Title)) } result.WriteString("\n") } return result.String(), nil }