diff --git a/main.go b/main.go index a712b47..5f0acbc 100644 --- a/main.go +++ b/main.go @@ -2,6 +2,7 @@ package main import ( "fmt" + "os" "go-mod.ewintr.nl/henk/structure" ) @@ -9,11 +10,12 @@ import ( func main() { filePath := "." // Replace with your Go file path - tree, err := structure.BuildTree(filePath) + project, err := structure.NewProject(filePath) if err != nil { fmt.Println(err) + os.Exit(1) } - structure.PrintTree(tree, "") + fmt.Printf("%s\n", project.Tree()) // err := structure.ProcessGoFile(filePath) // if err != nil { diff --git a/structure/structure.go b/structure/structure.go new file mode 100644 index 0000000..5c6103f --- /dev/null +++ b/structure/structure.go @@ -0,0 +1,156 @@ +package structure + +import ( + "fmt" + "os" + "path/filepath" + "strings" +) + +type ElementType string + +type Element struct { + Type ElementType + Description string + Content string +} + +type File struct { + Description string + Path string + Elements []Element +} + +func (f *File) Name() string { return filepath.Base(f.Path) } + +type Directory struct { + Module bool + Path string + Subs map[string]*Directory + Files map[string]*File +} + +type Project struct { + Dirs map[string]*Directory + Files map[string]*File +} + +func NewProject(path string) (*Project, error) { + fileInfo, err := os.Stat(path) + if err != nil { + return nil, err + } + if !fileInfo.IsDir() { + return nil, fmt.Errorf("path is not a directory") + } + + project := &Project{ + Dirs: make(map[string]*Directory), + Files: make(map[string]*File), + } + + files, err := os.ReadDir(path) + if err != nil { + return nil, err + } + for _, file := range files { + // skip hidden files for now + if strings.HasPrefix(file.Name(), ".") { + continue + } + + childPath := filepath.Join(path, file.Name()) + childInfo, err := os.Stat(childPath) + if err != nil { + return nil, err + } + if childInfo.IsDir() { + m, err := NewDirectory(childPath) + if err != nil { + return nil, err + } + project.Dirs[childPath] = m + continue + } + f, err := NewFile(childPath) + if err != nil { + return nil, err + } + project.Files[childPath] = f + } + + return project, nil +} + +func (p *Project) Tree() string { + res := make([]string, 0) + for _, d := range p.Dirs { + res = append(res, d.Tree(2)...) + } + for _, f := range p.Files { + res = append(res, f.Name()) + } + + return strings.Join(res, "\n") +} + +func NewFile(path string) (*File, error) { + // fmt.Println(path) + file := &File{ + Path: path, + } + + return file, nil +} + +func NewDirectory(path string) (*Directory, error) { + dir := &Directory{ + Path: path, + Subs: make(map[string]*Directory), + Files: make(map[string]*File), + } + + paths, err := os.ReadDir(path) + if err != nil { + return nil, err + } + for _, p := range paths { + childPath := filepath.Join(path, p.Name()) + childInfo, err := os.Stat(childPath) + if err != nil { + return nil, err + } + if childInfo.IsDir() { + d, err := NewDirectory(childPath) + if err != nil { + return nil, err + } + dir.Subs[childPath] = d + continue + } + f, err := NewFile(childPath) + if err != nil { + return nil, err + } + dir.Files[childPath] = f + } + + return dir, nil +} + +func (d *Directory) Tree(indent int) []string { + in := "" + for i := 0; i < indent; i++ { + in += " " + } + res := []string{d.Path} + for _, d := range d.Subs { + res = append(res, d.Tree(indent+2)...) + } + for _, f := range d.Files { + res = append(res, fmt.Sprintf("%s%s", in, f.Name())) + } + + return res + +} diff --git a/structure/tree.go b/structure/tree.go deleted file mode 100644 index c985b3d..0000000 --- a/structure/tree.go +++ /dev/null @@ -1,58 +0,0 @@ -package structure - -import ( - "fmt" - "os" - "path/filepath" - "strings" -) - -type PathTree struct { - Name string - IsDir bool - Children []*PathTree -} - -func BuildTree(path string) (*PathTree, error) { - fileInfo, err := os.Stat(path) - if err != nil { - return nil, err - } - node := &PathTree{ - Name: filepath.Base(path), - IsDir: fileInfo.IsDir(), - } - - if !node.IsDir { - return node, nil - } - - files, err := os.ReadDir(path) - if err != nil { - return nil, err - } - - for _, file := range files { - if strings.HasPrefix(file.Name(), ".") { - continue - } - childPath := filepath.Join(path, file.Name()) - childNode, err := BuildTree(childPath) - if err != nil { - return nil, err - } - node.Children = append(node.Children, childNode) - } - - return node, nil -} - -func PrintTree(node *PathTree, prefix string) { - fmt.Printf("%v* %s\n", prefix, node.Name) - newPrefix := prefix + " " - if len(node.Children) > 0 { - for _, child := range node.Children { - PrintTree(child, newPrefix+" ") - } - } -}