github.com/Yunsang-Jeong/terraforge@v0.0.0-20231003081416-fe4fad2c57e3/internal/utils/utils.go (about) 1 package utils 2 3 import ( 4 "errors" 5 "fmt" 6 "os" 7 "path/filepath" 8 ) 9 10 const MAX_DIR_DEPTH = 100 11 12 func GetSomethingInParents(base string, something string) (string, error) { 13 relPath, err := GetSomethingPathInParents(".", something, true) 14 if err != nil { 15 return "", err 16 } 17 18 data, err := LoadFileAsString(relPath) 19 if err != nil { 20 return "", err 21 } 22 23 return data, nil 24 } 25 26 func GetSomethingPathInParents(base string, something string, returnRelPath bool) (string, error) { 27 baseAbsPath, err := filepath.Abs(base) 28 if err != nil { 29 return "", err 30 } 31 32 current := baseAbsPath 33 for i := 0; i < MAX_DIR_DEPTH; i++ { 34 if FileExists(filepath.Join(current, something)) { 35 if returnRelPath { 36 rel, err := filepath.Rel(baseAbsPath, current) 37 if err != nil { 38 return "", err 39 } 40 41 return filepath.Join(rel, something), nil 42 } 43 44 return filepath.Join(current, something), nil 45 } 46 47 if current == "/" { 48 return "", errors.New("reached the root directory") 49 } 50 51 current = filepath.Dir(current) 52 } 53 54 return "", errors.New("reached the depth-limit") 55 } 56 57 func LoadFileAsString(path string) (string, error) { 58 fmt.Println(path) 59 if !IsFile(path) { 60 return "", errors.New("this is not file") 61 } 62 63 contents, err := os.ReadFile(path) 64 if err != nil { 65 return "", err 66 } 67 68 return string(contents), nil 69 } 70 71 func FileExists(path string) bool { 72 _, err := os.Stat(path) 73 return err == nil 74 } 75 76 func FileNotExists(path string) bool { 77 _, err := os.Stat(path) 78 return os.IsNotExist(err) 79 } 80 81 func IsFile(path string) bool { 82 fileInfo, err := os.Stat(path) 83 return err == nil && !fileInfo.IsDir() 84 }