package output import ( "encoding/json" "fmt" "os" "strings" "github.com/kb-search/kb/internal/config" ) // IsJSON returns true if the configured output format is "json". func IsJSON() bool { return config.Get().DefaultFormat == "json" } // PrintJSON pretty-prints data as JSON to stdout. func PrintJSON(data interface{}) { enc := json.NewEncoder(os.Stdout) enc.SetIndent("", " ") _ = enc.Encode(data) } // PrintTable prints a simple aligned table with headers and rows. func PrintTable(headers []string, rows [][]string) { if len(headers) == 0 { return } // Calculate column widths widths := make([]int, len(headers)) for i, h := range headers { widths[i] = len(h) } for _, row := range rows { for i := 0; i < len(row) && i < len(widths); i++ { if len(row[i]) > widths[i] { widths[i] = len(row[i]) } } } // Print header for i, h := range headers { if i > 0 { fmt.Print(" ") } fmt.Printf("%-*s", widths[i], h) } fmt.Println() // Print separator for i, w := range widths { if i > 0 { fmt.Print(" ") } fmt.Print(strings.Repeat("-", w)) } fmt.Println() // Print rows for _, row := range rows { for i := 0; i < len(headers); i++ { if i > 0 { fmt.Print(" ") } val := "" if i < len(row) { val = row[i] } fmt.Printf("%-*s", widths[i], val) } fmt.Println() } } // PrintKeyValue prints aligned key-value pairs. func PrintKeyValue(pairs [][]string) { maxKey := 0 for _, p := range pairs { if len(p) >= 2 && len(p[0]) > maxKey { maxKey = len(p[0]) } } for _, p := range pairs { if len(p) >= 2 { fmt.Printf("%-*s %s\n", maxKey, p[0]+":", p[1]) } } }