package v1 import ( "errors" "fmt" "strings" ) var ErrInvalidHostDir = errors.New("invalid hostDir specification") type HostDir struct { Name string `json:"name,omitempty"` Path string `json:"path,omitempty"` ReadOnly bool `json:"ro,omitempty"` } func NewHostDirFromString(s string) (HostDir, error) { var readOnly bool // Detect read-only (":ro") modifier // and remove it from the string if strings.HasSuffix(s, ":ro") { s = strings.TrimSuffix(s, ":ro") readOnly = true } // Limit the maximum number of splits to 2 // to support "http{,s}://..." paths[1] // ^ // [1]: https://github.com/cirruslabs/tart/pull/620 parts := strings.SplitN(s, ":", 2) if len(parts) < 2 { return HostDir{}, fmt.Errorf("%w: hostDir specification needs to contain a name and a path "+ "separated by a colon (\":\")", ErrInvalidHostDir) } if parts[0] == "" { return HostDir{}, fmt.Errorf("%w: name cannot be empty", ErrInvalidHostDir) } if parts[1] == "" { return HostDir{}, fmt.Errorf("%w: path cannot be empty", ErrInvalidHostDir) } return HostDir{ Name: parts[0], Path: parts[1], ReadOnly: readOnly, }, nil } func (hostDir HostDir) String() string { var roPart string if hostDir.ReadOnly { roPart = ":ro" } return fmt.Sprintf("%s:%s%s", hostDir.Name, hostDir.Path, roPart) }