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 }