github.com/avenga/couper@v1.12.2/config/configload/file/file.go (about) 1 package file 2 3 import ( 4 "os" 5 "path/filepath" 6 ) 7 8 type File = struct { 9 Path string 10 IsDir bool 11 Children Files 12 } 13 14 type Files []File 15 16 func NewFile(filePath string) File { 17 return File{ 18 Path: filePath, 19 IsDir: false, 20 } 21 } 22 23 func NewDir(filePath string) (File, error) { 24 children, err := readDir(filePath) 25 return File{ 26 Path: filePath, 27 IsDir: true, 28 Children: children, 29 }, err 30 } 31 32 func NewFiles(filesList []string) ([]File, error) { 33 var files []File 34 35 for _, f := range filesList { 36 filePath, err := filepath.Abs(f) 37 if err != nil { 38 return nil, err 39 } 40 41 fileInfo, err := os.Stat(filePath) 42 if err != nil { 43 return nil, err 44 } 45 46 if fileInfo.IsDir() { 47 dir, err := NewDir(filePath) 48 if err != nil { 49 return nil, err 50 } 51 52 files = append(files, dir) 53 } else { 54 files = append(files, NewFile(filePath)) 55 } 56 } 57 58 return files, nil 59 } 60 61 func (f *Files) Refresh() (*Files, error) { 62 var result Files 63 for _, file := range *f { 64 if file.IsDir { 65 dir, err := NewDir(file.Path) 66 if err != nil { 67 return nil, err 68 } 69 result = append(result, dir) 70 } else { 71 result = append(result, file) 72 } 73 } 74 return &result, nil 75 } 76 77 func (f *Files) AsList() []string { 78 var list []string 79 for _, file := range *f { 80 if file.IsDir { 81 list = append(list, file.Children.AsList()...) 82 } else { 83 list = append(list, file.Path) 84 } 85 } 86 return list 87 } 88 89 func readDir(filePath string) (Files, error) { 90 // ReadDir ... returns a list ... sorted by filename. 91 listing, err := os.ReadDir(filePath) 92 if err != nil { 93 return nil, err 94 } 95 96 var entries Files 97 for _, item := range listing { 98 if item.IsDir() || filepath.Ext(item.Name()) != ".hcl" { 99 continue 100 } 101 102 filename := filepath.Join(filePath, item.Name()) 103 entries = append(entries, NewFile(filename)) 104 } 105 106 return entries, nil 107 }