// Copyright 2025 WIT.COM Inc Licensed GPL 3.0 package cobol import ( "fmt" "strings" ) // TODO: make this more generic // print the header // args := []string{"namespace", "cur br", "age", "master", "devel", "last tag", "", "", "", ""} // sizes := []int{40, 12, 6, 12, 16, 16, 16, 12, 12, 8} // lot.Printf(standardTableSize10(sizes, args)) // returns the line and the Sprintf fmt string func StandardTableRow(sizes []int, args []string) (string, string) { var fmts []string var parts []string for i, si := range sizes { var cell string var sfmt string if si < 0 { sfmt = "%-80s" } else if si == 0 { sfmt = "%-8.8s" } else { sfmt = "%-" + fmt.Sprintf("%d", si) + "." + fmt.Sprintf("%d", si) + "s " } fmts = append(fmts, sfmt) if len(args) > i { val := strings.ReplaceAll(args[i], "\r", "") val = strings.ReplaceAll(val, "\n", "") // removes newlines but squashes spaces (which is bad) // val := strings.Join(strings.Fields(args[i]), " ") cell = fmt.Sprintf(sfmt, val) parts = append(parts, cell) } else { break } } // todo: change pad based on total size(?) line := strings.Join(parts, " ") var small int if len(line) > TERMSIZE-2 { small = TERMSIZE - 2 } else { small = len(line) // todo: do something else with this // small = len(line) - 3 // if small < 0 { // small = 0 // } } smalls := fmt.Sprintf("small=%d", small) return line[0:small], strings.Join(fmts, " ") + " " + smalls } func StandardTableRowDebug(sizes []int, args []string) (string, string) { for i, si := range sizes { if len(args) > i { args[i] = fmt.Sprintf("(%d)%s", si, args[i]) // cell = fmt.Sprintf(sfmt, val) } } line, fmts := StandardTableRow(sizes, args) return line, fmts } /* func StandardTableSize5(sizes []int, args []string) string { WIDTH, _ := getTerminalWidth() var s string for i, si := range sizes { if si == 0 { s += "%-s " } else { s += "%-" + fmt.Sprintf("%d", si) + "s " if len(args[i]) > sizes[i] { args[i] = args[i][:sizes[i]] } } } // there must be a better syntax for this arg1 := args[0] arg2 := args[1] arg3 := args[2] arg4 := args[3] arg5 := args[4] all := fmt.Sprintf(s, arg1, arg2, arg3, arg4, arg5) return all[0:WIDTH] } */ func StandardTableSize10(sizes []int, args []string) string { WIDTH, _ := getTerminalWidth() var s string for i, si := range sizes { if si == 0 { s += "%-s " } else { s += "%-" + fmt.Sprintf("%d", si) + "s " if len(args[i]) > sizes[i] { args[i] = args[i][:sizes[i]] } } } // there must be a better syntax for this arg1 := args[0] arg2 := args[1] arg3 := args[2] arg4 := args[3] arg5 := args[4] arg6 := args[5] arg7 := args[6] arg8 := args[7] arg9 := args[8] arg10 := args[9] all := fmt.Sprintf(s, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10) var small int if len(all) > WIDTH { small = WIDTH } else { small = len(all) - 3 } return all[0:small] }