// 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) } } } }