113 lines
2.7 KiB
Go
113 lines
2.7 KiB
Go
// Copyright (c) 2024 Celestino Amoroso (celestino.amoroso@gmail.com).
|
|
// All rights reserved.
|
|
|
|
// import-utils.go
|
|
package expr
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"os"
|
|
"path"
|
|
"path/filepath"
|
|
"strings"
|
|
)
|
|
|
|
const (
|
|
ENV_EXPR_SOURCE_PATH = "EXPR_PATH"
|
|
ENV_EXPR_PLUGIN_PATH = "EXPR_PLUGIN_PATH"
|
|
)
|
|
|
|
func checkStringParamExpected(funcName string, paramValue any, paramPos int) (err error) {
|
|
if !(IsString(paramValue) /*|| isList(paramValue)*/) {
|
|
err = fmt.Errorf("%s(): param nr %d has wrong type %s, string expected", funcName, paramPos+1, TypeName(paramValue))
|
|
}
|
|
return
|
|
}
|
|
|
|
// func addSourceEnvImportDirs(varName string, dirList []string) []string {
|
|
// return addEnvImportDirs(ENV_EXPR_SOURCE_PATH, dirList)
|
|
// }
|
|
|
|
// func addPluginEnvImportDirs(varName string, dirList []string) []string {
|
|
// return addEnvImportDirs(ENV_EXPR_PLUGIN_PATH, dirList)
|
|
// }
|
|
|
|
func addEnvImportDirs(envVarName string, dirList []string) []string {
|
|
if dirSpec, exists := os.LookupEnv(envVarName); exists {
|
|
dirs := strings.Split(dirSpec, ":")
|
|
if dirList == nil {
|
|
dirList = dirs
|
|
} else {
|
|
dirList = append(dirList, dirs...)
|
|
}
|
|
}
|
|
return dirList
|
|
}
|
|
|
|
func addSearchDirs(endingPath string, dirList []string) []string {
|
|
if dirSpec, exists := getControlString(ControlSearchPath); exists {
|
|
dirs := strings.Split(dirSpec, ":")
|
|
if dirList == nil {
|
|
dirList = dirs
|
|
} else {
|
|
if len(endingPath) > 0 {
|
|
for _, d := range dirs {
|
|
dirList = append(dirList, path.Join(d, endingPath))
|
|
}
|
|
} else {
|
|
dirList = append(dirList, dirs...)
|
|
}
|
|
}
|
|
}
|
|
return dirList
|
|
}
|
|
|
|
func buildSearchDirList(endingPath, envVarName string) (dirList []string) {
|
|
dirList = addEnvImportDirs(envVarName, dirList)
|
|
dirList = addSearchDirs(endingPath, dirList)
|
|
return
|
|
}
|
|
|
|
func isFile(filePath string) bool {
|
|
info, err := os.Stat(filePath)
|
|
return (err == nil || errors.Is(err, os.ErrExist)) && info.Mode().IsRegular()
|
|
}
|
|
|
|
func searchAmongPath(filename string, dirList []string) (filePath string) {
|
|
var err error
|
|
for _, dir := range dirList {
|
|
if dir, err = ExpandPath(dir); err != nil {
|
|
continue
|
|
}
|
|
if fullPath := path.Join(dir, filename); isFile(fullPath) {
|
|
filePath = fullPath
|
|
break
|
|
}
|
|
}
|
|
return
|
|
}
|
|
|
|
func isPathRelative(filePath string) bool {
|
|
unixPath := filepath.ToSlash(filePath)
|
|
return strings.HasPrefix(unixPath, "./") || strings.HasPrefix(unixPath, "../")
|
|
}
|
|
|
|
func makeFilepath(filename string, dirList []string) (filePath string, err error) {
|
|
if filename, err = ExpandPath(filename); err != nil {
|
|
return
|
|
}
|
|
|
|
if path.IsAbs(filename) || isPathRelative(filename) {
|
|
if isFile(filename) {
|
|
filePath = filename
|
|
}
|
|
} else {
|
|
filePath = searchAmongPath(filename, dirList)
|
|
}
|
|
if len(filePath) == 0 {
|
|
err = fmt.Errorf("file %q not found", filename)
|
|
}
|
|
return
|
|
}
|