mirror of
https://github.com/datarhei/core.git
synced 2025-09-27 04:16:25 +08:00
198 lines
2.9 KiB
Go
198 lines
2.9 KiB
Go
package value
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"os/exec"
|
|
"path/filepath"
|
|
"strings"
|
|
)
|
|
|
|
// must directory
|
|
|
|
type MustDir string
|
|
|
|
func NewMustDir(p *string, val string) *MustDir {
|
|
*p = val
|
|
return (*MustDir)(p)
|
|
}
|
|
|
|
func (u *MustDir) Set(val string) error {
|
|
*u = MustDir(val)
|
|
return nil
|
|
}
|
|
|
|
func (u *MustDir) String() string {
|
|
return string(*u)
|
|
}
|
|
|
|
func (u *MustDir) Validate() error {
|
|
val := string(*u)
|
|
|
|
if len(strings.TrimSpace(val)) == 0 {
|
|
return fmt.Errorf("path name must not be empty")
|
|
}
|
|
|
|
finfo, err := os.Stat(val)
|
|
if err != nil {
|
|
return fmt.Errorf("%s does not exist", val)
|
|
}
|
|
|
|
if !finfo.IsDir() {
|
|
return fmt.Errorf("%s is not a directory", val)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (u *MustDir) IsEmpty() bool {
|
|
return len(string(*u)) == 0
|
|
}
|
|
|
|
// directory
|
|
|
|
type Dir string
|
|
|
|
func NewDir(p *string, val string) *Dir {
|
|
*p = val
|
|
return (*Dir)(p)
|
|
}
|
|
|
|
func (u *Dir) Set(val string) error {
|
|
*u = Dir(val)
|
|
return nil
|
|
}
|
|
|
|
func (u *Dir) String() string {
|
|
return string(*u)
|
|
}
|
|
|
|
func (u *Dir) Validate() error {
|
|
val := string(*u)
|
|
|
|
if len(strings.TrimSpace(val)) == 0 {
|
|
return nil
|
|
}
|
|
|
|
finfo, err := os.Stat(val)
|
|
if err != nil {
|
|
return fmt.Errorf("%s does not exist", val)
|
|
}
|
|
|
|
if !finfo.IsDir() {
|
|
return fmt.Errorf("%s is not a directory", val)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (u *Dir) IsEmpty() bool {
|
|
return len(string(*u)) == 0
|
|
}
|
|
|
|
// executable
|
|
|
|
type Exec string
|
|
|
|
func NewExec(p *string, val string) *Exec {
|
|
*p = val
|
|
return (*Exec)(p)
|
|
}
|
|
|
|
func (u *Exec) Set(val string) error {
|
|
*u = Exec(val)
|
|
return nil
|
|
}
|
|
|
|
func (u *Exec) String() string {
|
|
return string(*u)
|
|
}
|
|
|
|
func (u *Exec) Validate() error {
|
|
val := string(*u)
|
|
|
|
_, err := exec.LookPath(val)
|
|
if err != nil {
|
|
return fmt.Errorf("%s not found or is not executable", val)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (u *Exec) IsEmpty() bool {
|
|
return len(string(*u)) == 0
|
|
}
|
|
|
|
// regular file
|
|
|
|
type File string
|
|
|
|
func NewFile(p *string, val string) *File {
|
|
*p = val
|
|
return (*File)(p)
|
|
}
|
|
|
|
func (u *File) Set(val string) error {
|
|
*u = File(val)
|
|
return nil
|
|
}
|
|
|
|
func (u *File) String() string {
|
|
return string(*u)
|
|
}
|
|
|
|
func (u *File) Validate() error {
|
|
val := string(*u)
|
|
|
|
if len(val) == 0 {
|
|
return nil
|
|
}
|
|
|
|
finfo, err := os.Stat(val)
|
|
if err != nil {
|
|
return fmt.Errorf("%s does not exist", val)
|
|
}
|
|
|
|
if !finfo.Mode().IsRegular() {
|
|
return fmt.Errorf("%s is not a regular file", val)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (u *File) IsEmpty() bool {
|
|
return len(string(*u)) == 0
|
|
}
|
|
|
|
// absolute path
|
|
|
|
type AbsolutePath string
|
|
|
|
func NewAbsolutePath(p *string, val string) *AbsolutePath {
|
|
*p = filepath.Clean(val)
|
|
return (*AbsolutePath)(p)
|
|
}
|
|
|
|
func (s *AbsolutePath) Set(val string) error {
|
|
*s = AbsolutePath(filepath.Clean(val))
|
|
return nil
|
|
}
|
|
|
|
func (s *AbsolutePath) String() string {
|
|
return string(*s)
|
|
}
|
|
|
|
func (s *AbsolutePath) Validate() error {
|
|
path := string(*s)
|
|
|
|
if !filepath.IsAbs(path) {
|
|
return fmt.Errorf("%s is not an absolute path", path)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (s *AbsolutePath) IsEmpty() bool {
|
|
return len(string(*s)) == 0
|
|
}
|