// Package renderer provides Packet diagram rendering package renderer import ( "fmt" "strings" "mermaid-go/pkg/ast" ) // PacketRenderer implements Packet diagram rendering type PacketRenderer struct{} // NewPacketRenderer creates a new Packet renderer func NewPacketRenderer() *PacketRenderer { return &PacketRenderer{} } // Render renders a Packet diagram to mermaid syntax func (r *PacketRenderer) Render(diagram *ast.PacketDiagram) (string, error) { var result strings.Builder // Start with packet keyword result.WriteString("packet\n") // Add title if present if diagram.Title != nil { result.WriteString(fmt.Sprintf(" title %s\n", *diagram.Title)) } // Render packets for _, packet := range diagram.Packets { result.WriteString(fmt.Sprintf(" %s", packet.Label)) if packet.Type != "" { result.WriteString(fmt.Sprintf(" %s", packet.Type)) } if packet.Protocol != nil { result.WriteString(fmt.Sprintf(" %s", *packet.Protocol)) } result.WriteString("\n") } // Render flows for _, flow := range diagram.Flows { result.WriteString(fmt.Sprintf(" %s --> %s", flow.From, flow.To)) if flow.Protocol != nil { result.WriteString(fmt.Sprintf(" %s", *flow.Protocol)) } if flow.Label != nil { result.WriteString(fmt.Sprintf(" : %s", *flow.Label)) } result.WriteString("\n") } return result.String(), nil }