github.com/joey-fossa/fossa-cli@v0.7.34-0.20190708193710-569f1e8679f0/buildtools/composer/readtree_generated.go (about)

     1  // This file was automatically generated by genny.
     2  // Any changes will be lost if this file is regenerated.
     3  // see https://github.com/cheekybits/genny
     4  
     5  package composer
     6  
     7  // level is 1-indexed
     8  type LineParser func(line string) (level int, node Package, err error)
     9  
    10  func ReadPackageTree(lines []string, parser LineParser) ([]Package, map[Package][]Package, error) {
    11  	var imports []Package
    12  	edges := make(map[Package]map[Package]bool)
    13  	parents := []Package{}
    14  
    15  	for _, line := range lines {
    16  		level, node, err := parser(line)
    17  		if err != nil {
    18  			return nil, nil, err
    19  		}
    20  
    21  		// Add to graph.
    22  		if len(parents) >= level {
    23  			parents = parents[:level-1]
    24  		}
    25  		if level == 1 {
    26  			imports = append(imports, node)
    27  		} else {
    28  			parent := parents[len(parents)-1]
    29  			_, ok := edges[parent]
    30  			if !ok {
    31  				edges[parent] = make(map[Package]bool)
    32  			}
    33  			edges[parent][node] = true
    34  		}
    35  		parents = append(parents, node)
    36  	}
    37  
    38  	graph := make(map[Package][]Package)
    39  	for parent, children := range edges {
    40  		for child := range children {
    41  			graph[parent] = append(graph[parent], child)
    42  			_, ok := graph[child]
    43  			if !ok {
    44  				graph[child] = nil
    45  			}
    46  		}
    47  	}
    48  	for _, i := range imports {
    49  		_, ok := edges[i]
    50  		if !ok {
    51  			graph[i] = nil
    52  		}
    53  	}
    54  
    55  	return imports, graph, nil
    56  }