69 lines
1.1 KiB
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[:])
|
|
}
|