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[:]) }