mirror of
https://codeberg.org/scip/esctl.git
synced 2026-08-24 04:54:18 +02:00
84 lines
2.2 KiB
Go
84 lines
2.2 KiB
Go
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 <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
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(cell any) string {
|
|
//nolint:gocritic
|
|
switch val := cell.(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 cell.(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, ""))
|
|
}
|