hakurei/hst/fslink.go
Ophestra c328b584c0
All checks were successful
Test / Create distribution (push) Successful in 35s
Test / Sandbox (push) Successful in 2m7s
Test / Hakurei (push) Successful in 3m14s
Test / Hpkg (push) Successful in 4m1s
Test / Sandbox (race detector) (push) Successful in 4m29s
Test / Hakurei (race detector) (push) Successful in 5m9s
Test / Flake checks (push) Successful in 1m25s
hst/fslink: improve string representation
This shortens the representation of most common use cases and generally improves readability.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2025-08-25 22:52:48 +09:00

62 lines
1.2 KiB
Go

package hst
import (
"encoding/gob"
"path"
"hakurei.app/container"
)
func init() { gob.Register(new(FSLink)) }
// FilesystemLink is the type string of a symbolic link.
const FilesystemLink = "link"
// FSLink represents a symlink in the container filesystem.
type FSLink struct {
// link path in container
Target *container.Absolute `json:"dst"`
// linkname the symlink points to
Linkname string `json:"linkname"`
// whether to dereference linkname before creating the link
Dereference bool `json:"dereference,omitempty"`
}
func (l *FSLink) Valid() bool {
if l == nil || l.Target == nil || l.Linkname == "" {
return false
}
return !l.Dereference || path.IsAbs(l.Linkname)
}
func (l *FSLink) Path() *container.Absolute {
if !l.Valid() {
return nil
}
return l.Target
}
func (l *FSLink) Host() []*container.Absolute { return nil }
func (l *FSLink) Apply(z *ApplyState) {
if !l.Valid() {
return
}
z.Link(l.Target, l.Linkname, l.Dereference)
}
func (l *FSLink) String() string {
if !l.Valid() {
return "<invalid>"
}
var dereference string
if l.Dereference {
if l.Target.String() == l.Linkname {
return l.Target.String() + "@"
}
dereference = "*"
}
return l.Target.String() + " -> " + dereference + l.Linkname
}