logimpl/report.go

118 lines
3.1 KiB
Go

// Copyright (c) 2024 Celestino Amoroso (celestino.amoroso@gmail.com).
// All rights reserved.
// report.go
package logimpl
import (
"fmt"
"slices"
"strings"
"git.portale-stac.it/go-pkg/logger"
"git.portale-stac.it/go-pkg/utils"
)
// Report params
const (
DOT_PAD = "."
VALUE_TEMPL = ": %#v"
NAME_FIELD_SIZE = 30
TOTAL_FIELD_SIZE = 34
)
type Report struct {
pad string
valueTempl string
nameFieldSize int
totalFieldSize int
log logger.VerboseLogger
}
func NewReport(log logger.VerboseLogger) (report *Report) {
report = &Report{
pad: DOT_PAD,
valueTempl: VALUE_TEMPL,
nameFieldSize: NAME_FIELD_SIZE,
totalFieldSize: TOTAL_FIELD_SIZE,
log: log,
}
return
}
func (rep *Report) Log() logger.VerboseLogger {
return rep.log
}
func (rep *Report) PutBrownWithPadRawCase(name string, value any, fieldSize int) {
name = utils.PadStringRight(name, rep.pad, fieldSize, rep.valueTempl)
rep.log.VerboseBrownf(name, value)
}
func (rep *Report) PutBrownWithPad(name string, value any, fieldSize int) {
name = strings.Title(name)
name = utils.PadStringRight(name, rep.pad, fieldSize, rep.valueTempl)
rep.log.VerboseBrownf(name, value)
}
func (rep *Report) PutBlueWithPad(name string, value any, fieldSize int) {
name = strings.Title(name)
name = utils.PadStringRight(name, rep.pad, fieldSize, rep.valueTempl)
rep.log.VerboseBluef(name, value)
}
func (rep *Report) PutParam(name string, value any) {
rep.PutBrownWithPad(name, value, rep.nameFieldSize)
}
func (rep *Report) PutVar(name string, value any) {
rep.PutBrownWithPadRawCase(name, value, rep.nameFieldSize)
}
func (rep *Report) PutParamWithError(name string, err error, value any) {
if err != nil {
tty, _ := rep.log.GetProperty(CONSOLE_LOG_TTY).(*utils.TTYContext)
value = fmt.Sprintf("%v -- %s%v%s", value, tty.RedFg(utils.STDERR), err, tty.Reset(utils.STDERR))
}
rep.PutBrownWithPad(name, value, rep.nameFieldSize)
}
func (rep *Report) PutTotal(name string, value any) {
rep.PutBlueWithPad(name, value, rep.totalFieldSize)
}
func (rep *Report) PutTotalCond(name string, good bool, value any) {
var styledValue string
tty, _ := rep.log.GetProperty(CONSOLE_LOG_TTY).(*utils.TTYContext)
name = utils.PadStringRight(name, DOT_PAD, TOTAL_FIELD_SIZE, rep.valueTempl)
if good {
styledValue = fmt.Sprintf("%s%v%s", tty.GreenFg(utils.STDERR), value, tty.Reset(utils.STDERR))
} else {
styledValue = fmt.Sprintf("%s%v%s", tty.RedFg(utils.STDERR), value, tty.Reset(utils.STDERR))
}
rep.log.VerboseBluef(name, styledValue)
}
func (rep *Report) PutVars(vars map[string]string, sortKeys bool) {
if vars != nil {
if sortKeys {
keys := make([]string, len(vars))
i := 0
for key := range vars {
keys[i] = key
i++
}
slices.Sort(keys)
for _, key := range keys {
name := utils.PadStringRight(key, rep.pad, rep.nameFieldSize, rep.valueTempl)
rep.log.VerboseBrownf(name, vars[key])
}
} else {
for key, value := range vars {
name := utils.PadStringRight(key, rep.pad, rep.nameFieldSize, rep.valueTempl)
rep.log.VerboseBrownf(name, value)
}
}
}
}