// Class diagram AST structures based on classDiagram.jison package ast // ClassDiagram represents a class diagram type ClassDiagram struct { Classes map[string]*ClassNode `json:"classes"` Relations []*ClassRelation `json:"relations"` ClassDefs map[string]*ClassDef `json:"classDefs"` Notes []*ClassNote `json:"notes,omitempty"` Direction string `json:"direction,omitempty"` Title *string `json:"title,omitempty"` Config map[string]any `json:"config,omitempty"` } type ClassNode struct { ID string `json:"id"` Label string `json:"label"` Type ClassType `json:"type"` Members []*ClassMember `json:"members"` Methods []*ClassMethod `json:"methods"` Annotations []string `json:"annotations,omitempty"` Link *string `json:"link,omitempty"` LinkTarget *string `json:"linkTarget,omitempty"` Tooltip *string `json:"tooltip,omitempty"` CssClasses []string `json:"cssClasses,omitempty"` } type ClassType string const ( ClassTypeClass ClassType = "class" ClassTypeInterface ClassType = "interface" ClassTypeEnum ClassType = "enumeration" ClassTypeAbstract ClassType = "abstract" ) type ClassMember struct { Name string `json:"name"` Type string `json:"type"` Generics []*Generic `json:"generics,omitempty"` Visibility MemberVisibility `json:"visibility"` Classifier *string `json:"classifier,omitempty"` // static, abstract } type ClassMethod struct { Name string `json:"name"` Type string `json:"type"` Generics []*Generic `json:"generics,omitempty"` Parameters []string `json:"parameters,omitempty"` Visibility MemberVisibility `json:"visibility"` Classifier *string `json:"classifier,omitempty"` // static, abstract } type MemberVisibility string const ( VisibilityPublic MemberVisibility = "+" VisibilityPrivate MemberVisibility = "-" VisibilityProtected MemberVisibility = "#" VisibilityPackage MemberVisibility = "~" ) type ClassRelation struct { From string `json:"from"` To string `json:"to"` Type ClassRelationType `json:"type"` Label *string `json:"label,omitempty"` Cardinality *ClassCardinality `json:"cardinality,omitempty"` } type ClassRelationType string const ( RelationInheritance ClassRelationType = "inheritance" // --|> RelationComposition ClassRelationType = "composition" // --* RelationAggregation ClassRelationType = "aggregation" // --o RelationAssociation ClassRelationType = "association" // --> RelationRealization ClassRelationType = "realization" // ..|> RelationDependency ClassRelationType = "dependency" // ..> ) type ClassCardinality struct { From string `json:"from,omitempty"` To string `json:"to,omitempty"` } // ClassNote represents a note annotation type ClassNote struct { ID string `json:"id,omitempty"` ForClass *string `json:"forClass,omitempty"` Text string `json:"text"` Position NotePlace `json:"position,omitempty"` } // Generic represents a generic type parameter type Generic struct { Name string `json:"name"` Constraint *string `json:"constraint,omitempty"` Arguments []*Generic `json:"arguments,omitempty"` } // ClickEvent represents a click interaction type ClickEvent struct { NodeID string `json:"nodeId"` Callback *string `json:"callback,omitempty"` Link *string `json:"link,omitempty"` Target *string `json:"target,omitempty"` Tooltip *string `json:"tooltip,omitempty"` } type ClassDef struct { ID string `json:"id"` Styles []string `json:"styles"` } // Type returns the diagram type func (c *ClassDiagram) Type() DiagramType { return DiagramTypeClassDiagram } // Validate checks if the class diagram is valid func (c *ClassDiagram) Validate() error { // Validate relations reference valid classes for _, rel := range c.Relations { if _, exists := c.Classes[rel.From]; !exists { return NewValidationError("relation references non-existent class: " + rel.From) } if _, exists := c.Classes[rel.To]; !exists { return NewValidationError("relation references non-existent class: " + rel.To) } } return nil } // NewClassDiagram creates a new class diagram func NewClassDiagram() *ClassDiagram { return &ClassDiagram{ Classes: make(map[string]*ClassNode), Relations: make([]*ClassRelation, 0), ClassDefs: make(map[string]*ClassDef), Notes: make([]*ClassNote, 0), Config: make(map[string]any), } }