mukan-ignite/ignite/pkg/xfilepath/xfilepath.go
Mukan Erkin Törük 26b204bd04
Some checks are pending
Docs Deploy / build_and_deploy (push) Waiting to run
Generate Docs / cli (push) Waiting to run
Generate Config Doc / cli (push) Waiting to run
Go formatting / go-formatting (push) Waiting to run
Check links / markdown-link-check (push) Waiting to run
Integration / pre-test (push) Waiting to run
Integration / test on (push) Blocked by required conditions
Integration / status (push) Blocked by required conditions
Lint / Lint Go code (push) Waiting to run
Test / test (ubuntu-latest) (push) Waiting to run
feat: fork Ignite CLI v29 as Mukan Ignite — remove cosmos-sdk restrictions
2026-05-11 03:31:37 +03:00

118 lines
3.2 KiB
Go

// Package xfilepath defines functions to define path retrievers that support error handling
package xfilepath
import (
"os"
"path/filepath"
)
// PathRetriever is a function that retrieves the contained path or an error.
type PathRetriever func() (path string, err error)
// PathsRetriever is a function that retrieves the contained list of paths or an error.
type PathsRetriever func() (path []string, err error)
// MustInvoke invokes the PathsRetriever func and panics if it returns an error.
func MustInvoke(p PathRetriever) string {
path, err := p()
if err != nil {
panic(err)
}
return path
}
// Path returns a path retriever from the provided path.
func Path(path string) PathRetriever {
return func() (string, error) { return path, nil }
}
// PathWithError returns a path retriever from the provided path and error.
func PathWithError(path string, err error) PathRetriever {
return func() (string, error) { return path, err }
}
// Join returns a path retriever from the join of the provided path retrievers.
// The returned path retriever eventually returns the error from the first provided path retrievers
// that returns a non-nil error.
func Join(paths ...PathRetriever) PathRetriever {
return func() (string, error) {
var components []string
var err error
for _, path := range paths {
var component string
component, err = path()
if err != nil {
break
}
components = append(components, component)
}
path := filepath.Join(components...)
return path, err
}
}
// JoinFromHome returns a path retriever from the join of the user home and the provided path retrievers.
// The returned path retriever eventually returns the error from the first provided path retrievers that returns a non-nil error.
func JoinFromHome(paths ...PathRetriever) PathRetriever {
return Join(append([]PathRetriever{os.UserHomeDir}, paths...)...)
}
// List returns a paths retriever from a list of path retrievers.
// The returned paths retriever eventually returns the error from the first provided path retrievers that returns a non-nil error.
func List(paths ...PathRetriever) PathsRetriever {
return func() ([]string, error) {
var list []string
var err error
for _, path := range paths {
var resolved string
resolved, err = path()
if err != nil {
break
}
list = append(list, resolved)
}
return list, err
}
}
// Mkdir ensure path exists before returning it.
func Mkdir(path PathRetriever) PathRetriever {
return func() (string, error) {
p, err := path()
if err != nil {
return "", err
}
return p, os.MkdirAll(p, 0o755)
}
}
// RelativePath return the relative app path from the current directory.
func RelativePath(appPath string) (string, error) {
pwd, err := os.Getwd()
if err != nil {
return "", err
}
path, err := filepath.Rel(pwd, appPath)
if err != nil {
return "", err
}
return path, nil
}
// IsDir returns true if the path is a local directory.
func IsDir(path string) bool {
if info, err := os.Stat(path); err == nil && info.IsDir() {
return true
}
return false
}
// MustAbs returns an absolute representation of path
// if the path is not absolute.
func MustAbs(path string) (string, error) {
if !filepath.IsAbs(path) {
return filepath.Abs(path)
}
return path, nil
}