From 921a39423bae834dcc08f9f9bbc0d8f27f6ac08b Mon Sep 17 00:00:00 2001 From: Kirill Trofimov Date: Sat, 13 Sep 2025 17:43:45 +0300 Subject: [PATCH] fix: graph visualization write --- README.md | 1 - container.go | 32 ++++++++++++-------------------- 2 files changed, 12 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index 586f596..fb5a8f9 100644 --- a/README.md +++ b/README.md @@ -91,7 +91,6 @@ func (c *Container) MustResolve(target interface{}) - **Exact Type Matching Only** - No interface binding support - **Basic Named Dependencies** - No tags or name-based resolution - **No Lifecycle Hooks** - Basic startup/shutdown only -- **No Error Handling** - Doesn't support ctor-s with error return - **Limited ctor return types** - Only support ctors which returns pointers - **Only types in ctor return** - Doesn't support interfaces as ctor return value - **Only one return value** - one ctor = one value diff --git a/container.go b/container.go index 12ad6a2..8af09d1 100644 --- a/container.go +++ b/container.go @@ -2,10 +2,10 @@ package compoapp import ( - "bufio" "fmt" "os" "reflect" + "strings" "sync" ) @@ -449,9 +449,7 @@ func (c *Container) validateDependencies() error { const dotHeader string = `digraph DependencyGraph { rankdir=LR; node [shape=box, style=rounded, fontname="Arial"]; - edge [fontname="Arial"]; - -` + edge [fontname="Arial"];` // Visualize creates .dot file for graphviz visualization func (c *Container) Visualize(filepath string) error { @@ -464,13 +462,11 @@ func (c *Container) Visualize(filepath string) error { } defer f.Close() - writer := bufio.NewWriter(f) - defer writer.Flush() + b := strings.Builder{} // Write DOT header - if _, err := writer.WriteString(dotHeader); err != nil { - return fmt.Errorf("failed to write digraph header: %w", err) - } + b.WriteString(dotHeader) + b.WriteString("\n\n") nodes := make(map[string]struct{}) edges := make(map[string][]string) @@ -498,14 +494,10 @@ func (c *Container) Visualize(filepath string) error { } for nodeName := range nodes { - if _, err := fmt.Fprintf(writer, " %q;\n", nodeName); err != nil { - return fmt.Errorf("failed to write node name: %w", err) - } + b.WriteString(fmt.Sprintf(" %q;\n", nodeName)) } - if _, err := writer.WriteString("\n"); err != nil { - return fmt.Errorf("failed to write newline: %w", err) - } + b.WriteString("\n") addedEdges := make(map[string]struct{}) for from, toList := range edges { @@ -514,16 +506,16 @@ func (c *Container) Visualize(filepath string) error { if _, exists := addedEdges[edgeKey]; exists { continue } - if _, err := fmt.Fprintf(writer, " %q -> %q;\n", from, to); err != nil { - return fmt.Errorf("failed to write edge: %w", err) - } + b.WriteString(fmt.Sprintf(" %q -> %q;\n", from, to)) addedEdges[edgeKey] = struct{}{} } } // Close DOT graph - if _, err := writer.WriteString("}\n"); err != nil { - return fmt.Errorf("failed to write graph closure: %w", err) + b.WriteString("}\n") + + if _, err := f.WriteString(b.String()); err != nil { + return fmt.Errorf("cannot write to dot file: %w", err) } return nil