package printer /* Copyright © 2026 Thomas von Dein This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ import ( "fmt" "strconv" "strings" "time" "github.com/elastic/go-elasticsearch/v9/typedapi/types" ) // stringer returns the string representation of different types of // values func stringer(in any) string { //nolint:gocritic switch val := in.(type) { case string: return val case bool: return strconv.FormatBool(val) case int64: return strconv.FormatInt(val, 10) case int: return strconv.Itoa(val) case float64: return fmt.Sprintf("%.2f", val) case float32: return fmt.Sprintf("%.2f", val) case []string: return strings.Join(val, ",") case ByteSize: return val.String() case *ByteSize: return val.String() case time.Time: return val.Format("2006-01-02 15:04:05") case time.Duration: return val.String() case []byte: return string(val) case nil: return "null" case *types.Float64: // ignore err here, because types.Float64.MarshalJSON() never returns one f, _ := val.MarshalJSON() return string(f) default: // Caution: this may cause a panic if the [unknown] type does // not implement fmt.Stringer. In this case add another case // to the type switch for it above. return in.(fmt.Stringer).String() } } // visibleLen returns the length of a string but only visible chars, // w/o ansi color escapes func visibleLen(word string) int { if !strings.Contains(word, "\x1b") { // no ansi escape in there, use faster method return len(word) } // contains escapes, need to clean up before counting return len(ansiCtrlSeq.ReplaceAllLiteralString(word, "")) }