bb/pathx/main.go

108 lines
1.5 KiB
Go
Raw Normal View History

2023-02-16 19:28:05 +03:00
package pathx
// The package implements crossplatform structured
// paths.
import (
//"fmt"
2023-02-16 19:28:05 +03:00
"path"
2023-03-08 16:39:50 +03:00
fp "path/filepath"
2023-02-16 19:28:05 +03:00
"strings"
)
type Value string
type Path struct {
Values []Value
2023-03-08 16:39:50 +03:00
IsAbs bool
2023-02-16 19:28:05 +03:00
}
func (p Path) Append(values ...string) Path {
for _, v := range values {
p.Values = append(p.Values, Value(v))
}
return p
}
func From(p string) Path {
ret := Path{}
if len(p) == 0 {
return ret
}
p = path.Clean(p)
if p[0] == '/' {
ret.IsAbs = true
}
2023-02-16 19:28:05 +03:00
p, _ = strings.CutSuffix(p, "/")
svalues := strings.Split(p, "/")
values := make([]Value, len(svalues))
for i, s := range svalues {
values[i] = Value(s)
}
ret.Values = values
2023-02-16 19:28:05 +03:00
return ret
2023-02-16 19:28:05 +03:00
}
2023-03-08 16:39:50 +03:00
func FromReal(p string) Path {
ret := From(fp.ToSlash(p))
//fmt.Println("from real:", ret)
return ret
2023-03-08 16:39:50 +03:00
}
2023-02-16 19:28:05 +03:00
func (v Value) IsValid() bool {
return v.Err() == nil
}
func (v Value) Err() error {
return nil
}
func (p Path) StringValues() []string {
ret := []string{}
if p.IsAbs {
ret = append(ret, "/")
}
for _, v := range p.Values {
ret = append(ret, string(v))
2023-02-16 19:28:05 +03:00
}
return ret
2023-02-16 19:28:05 +03:00
}
func (p Path) Real() string {
2023-03-08 16:39:50 +03:00
return strings.Join(p.StringValues(), string(fp.Separator))
2023-02-16 19:28:05 +03:00
}
func (p Path) String() string {
2023-03-08 16:39:50 +03:00
ret := ""
if p.IsAbs {
ret = "/"
}
ret += path.Join(p.StringValues()...)
return ret
2023-02-16 19:28:05 +03:00
}
func (p Path) IsValid() bool {
for _, v := range p.Values {
if !v.IsValid() {
return false
}
}
return true
}
func (p Path) Err() error {
for _, v := range p.Values {
if !v.IsValid() {
return v.Err()
}
}
return nil
}