49 lines
1.2 KiB
Go
49 lines
1.2 KiB
Go
|
|
package fileutil
|
||
|
|
|
||
|
|
import (
|
||
|
|
"fmt"
|
||
|
|
"os"
|
||
|
|
)
|
||
|
|
|
||
|
|
// FindDataFile locates a data file by searching up the directory tree.
|
||
|
|
// This is useful for tests that may run from different directory depths.
|
||
|
|
//
|
||
|
|
// It searches in the following order:
|
||
|
|
// 1. Current directory
|
||
|
|
// 2. One level up (../)
|
||
|
|
// 3. Two levels up (../../)
|
||
|
|
// 4. Three levels up (../../../)
|
||
|
|
//
|
||
|
|
// Example:
|
||
|
|
//
|
||
|
|
// path, err := fileutil.FindDataFile("data/cv-en.json")
|
||
|
|
// if err != nil {
|
||
|
|
// log.Fatal(err)
|
||
|
|
// }
|
||
|
|
func FindDataFile(filename string) (string, error) {
|
||
|
|
if filename == "" {
|
||
|
|
return "", fmt.Errorf("filename cannot be empty")
|
||
|
|
}
|
||
|
|
|
||
|
|
// Try current directory first
|
||
|
|
if _, err := os.Stat(filename); err == nil {
|
||
|
|
return filename, nil
|
||
|
|
}
|
||
|
|
|
||
|
|
// Try parent directories (for tests running from subdirectories)
|
||
|
|
paths := []string{
|
||
|
|
filename, // Current dir
|
||
|
|
"../" + filename, // One level up
|
||
|
|
"../../" + filename, // Two levels up (for tests in internal/handlers)
|
||
|
|
"../../../" + filename, // Three levels up
|
||
|
|
}
|
||
|
|
|
||
|
|
for _, path := range paths {
|
||
|
|
if _, err := os.Stat(path); err == nil {
|
||
|
|
return path, nil
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
return "", fmt.Errorf("file not found: %s (searched: current dir, ../, ../../, ../../../)", filename)
|
||
|
|
}
|