ollie/virtfs/help.go

69 lines
1.1 KiB
Go

package virtfs
import (
"fmt"
"os"
"strings"
)
// GenerateHelp produces documentation from a filesystem spec tree.
func GenerateHelp(root FsNodeDecl) string {
return generateHelp(root, "")
}
func generateHelp(node FsNodeDecl, prefix string) string {
var sb strings.Builder
path := node.Name
if prefix != "" {
path = prefix + "/" + node.Name
}
if node.Name == "/" {
path = ""
}
if node.Desc != "" {
displayPath := path
if displayPath == "" {
displayPath = "/"
}
mode := node.Mode
if len(node.Children) > 0 || node.Bindings != nil {
mode = 0755 | os.ModeDir
}
fmt.Fprintf(&sb, "%-40s %s %s\n", displayPath, fmtMode(mode), node.Desc)
}
for _, child := range node.Children {
sb.WriteString(generateHelp(child, path))
}
return sb.String()
}
func fmtMode(m os.FileMode) string {
if m == 0 {
return "----"
}
var buf [4]byte
buf[0] = '-'
if m.IsDir() {
buf[0] = 'd'
}
buf[1] = 'r'
if m&0200 != 0 {
buf[1] = 'w'
}
if m&0400 != 0 {
buf[2] = 'r'
} else {
buf[2] = '-'
}
if m&0100 != 0 {
buf[3] = 'x'
} else {
buf[3] = '-'
}
return string(buf[:])
}