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  }