packet.go 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. // Package renderer provides Packet diagram rendering
  2. package renderer
  3. import (
  4. "fmt"
  5. "strings"
  6. "mermaid-go/pkg/ast"
  7. )
  8. // PacketRenderer implements Packet diagram rendering
  9. type PacketRenderer struct{}
  10. // NewPacketRenderer creates a new Packet renderer
  11. func NewPacketRenderer() *PacketRenderer {
  12. return &PacketRenderer{}
  13. }
  14. // Render renders a Packet diagram to mermaid syntax
  15. func (r *PacketRenderer) Render(diagram *ast.PacketDiagram) (string, error) {
  16. var result strings.Builder
  17. // Start with packet keyword
  18. result.WriteString("packet\n")
  19. // Add title if present
  20. if diagram.Title != nil {
  21. result.WriteString(fmt.Sprintf(" title %s\n", *diagram.Title))
  22. }
  23. // Render packets
  24. for _, packet := range diagram.Packets {
  25. result.WriteString(fmt.Sprintf(" %s", packet.Label))
  26. if packet.Type != "" {
  27. result.WriteString(fmt.Sprintf(" %s", packet.Type))
  28. }
  29. if packet.Protocol != nil {
  30. result.WriteString(fmt.Sprintf(" %s", *packet.Protocol))
  31. }
  32. result.WriteString("\n")
  33. }
  34. // Render flows
  35. for _, flow := range diagram.Flows {
  36. result.WriteString(fmt.Sprintf(" %s --> %s", flow.From, flow.To))
  37. if flow.Protocol != nil {
  38. result.WriteString(fmt.Sprintf(" %s", *flow.Protocol))
  39. }
  40. if flow.Label != nil {
  41. result.WriteString(fmt.Sprintf(" : %s", *flow.Label))
  42. }
  43. result.WriteString("\n")
  44. }
  45. return result.String(), nil
  46. }