| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144 |
- // 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),
- }
- }
|