github.com/devstream-io/devstream@v0.13.3/internal/pkg/scaffold/tree/parse.go (about)

     1  package tree
     2  
     3  import "strings"
     4  
     5  // testdir/
     6  // ├── dir1/
     7  // │   ├── file1.go
     8  // │   └── dir2/
     9  // │       ├── file1.go
    10  // │       └── file2.go
    11  // └── FILE3.md
    12  func ParseTree(treeText string) *TreeNode {
    13  	lines := strings.Split(treeText, "\n")
    14  	rootLine := strings.TrimSpace(lines[0])
    15  	rootName := strings.TrimSuffix(rootLine, "/")
    16  	root := NewTreeNode(rootName, true)
    17  	stack := []*TreeNode{root}
    18  
    19  	for _, line := range lines[1:] {
    20  		// dir1 as an example, the indent is 3+2=5 in "├── dir1/".
    21  		indent := strings.LastIndex(line, "──") + 2
    22  		// line[indent:] apply to dir1/, the result is " dir1/"
    23  		// name is "dir1/"
    24  		name := strings.TrimSpace(line[indent:])
    25  		isDir := strings.HasSuffix(name, "/")
    26  		if isDir {
    27  			name = strings.TrimSuffix(name, "/")
    28  		}
    29  
    30  		node := NewTreeNode(name, isDir)
    31  		parent := stack[indent/4]
    32  		parent.AddChild(node)
    33  
    34  		if isDir {
    35  			stack = append(stack, node)
    36  		} else {
    37  			stack = append(stack[:indent/4+1], node)
    38  		}
    39  	}
    40  	return root
    41  }