mirror of
https://github.com/datarhei/core.git
synced 2025-10-05 07:57:13 +08:00

If the config on the disk doesn't have all fields, then the missing fields are now populated with their defaults.
203 lines
2.9 KiB
Go
203 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
|
|
}
|