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  }