github.com/alkemics/goflow@v0.2.1/wrappers/imports/merger.go (about) 1 package imports 2 3 import ( 4 "path" 5 6 "github.com/alkemics/goflow" 7 ) 8 9 func Merger(_ func(interface{}) error, graph goflow.GraphRenderer) (goflow.GraphRenderer, error) { 10 return merger{GraphRenderer: graph}, nil 11 } 12 13 type merger struct { 14 goflow.GraphRenderer 15 } 16 17 func (g merger) Imports() []goflow.Import { 18 imports := Merge(g.GraphRenderer.Imports()) 19 20 for _, node := range g.Nodes() { 21 imports = Merge(imports, node.Imports()...) 22 } 23 24 // Remove the package if redundant. 25 for i, imp := range imports { 26 if path.Base(imp.Dir) == imp.Pkg { 27 imports[i].Pkg = "" 28 } 29 } 30 31 return imports 32 } 33 34 // Compile time check 35 var _ goflow.GraphRenderer = merger{} 36 37 func Merge(imports []goflow.Import, others ...goflow.Import) []goflow.Import { 38 merged := make([]goflow.Import, 0) 39 importDirs := make(map[string]struct{}) 40 41 for _, imp := range imports { 42 if _, ok := importDirs[imp.Dir]; !ok { 43 importDirs[imp.Dir] = struct{}{} 44 45 merged = append(merged, imp) 46 } 47 } 48 49 for _, imp := range others { 50 if _, ok := importDirs[imp.Dir]; !ok { 51 importDirs[imp.Dir] = struct{}{} 52 53 merged = append(merged, imp) 54 } 55 } 56 57 return merged 58 }