feat: survey 包支持对报告字段进行格式化处理

This commit is contained in:
kercylan98 2023-11-27 10:29:00 +08:00
parent 5c954f0c2a
commit ed5be97234
3 changed files with 31 additions and 5 deletions

View File

@ -8,13 +8,13 @@ import (
// DataMeta 全局活动数据
type DataMeta[Data any] struct {
once sync.Once
Data Data `json:"data,omitempty"` // 活动数据
LastNewDay time.Time `json:"lastNewDay,omitempty"` // 上次跨天时间
Data Data `json:"data,omitempty"` // 活动数据
LastNewDay time.Time `json:"last_new_day,omitempty"` // 上次跨天时间
}
// EntityDataMeta 活动实体数据
type EntityDataMeta[Data any] struct {
once sync.Once
Data Data `json:"data,omitempty"` // 活动数据
LastNewDay time.Time `json:"lastNewDay,omitempty"` // 上次跨天时间
Data Data `json:"data,omitempty"` // 活动数据
LastNewDay time.Time `json:"last_new_day,omitempty"` // 上次跨天时间
}

View File

@ -12,6 +12,7 @@ type Analyzer struct {
vc map[string]int64 // 记录了每个 key 生效的计数数量
repeat map[string]struct{} // 去重信息
subs map[string]*Analyzer
format map[string]func(v any) any // 格式化函数
m sync.Mutex
}
@ -30,6 +31,16 @@ func (slf *Analyzer) Sub(key string) *Analyzer {
return sub
}
// SetFormat 设置格式化函数
func (slf *Analyzer) SetFormat(key string, format func(v any) any) {
slf.m.Lock()
defer slf.m.Unlock()
if slf.format == nil {
slf.format = make(map[string]func(v any) any)
}
slf.format[key] = format
}
// SetValueIfGreaterThan 设置指定 key 的值,当新值大于旧值时
// - 当已有值不为 float64 时,将会被忽略
func (slf *Analyzer) SetValueIfGreaterThan(key string, value float64) {

View File

@ -1,6 +1,7 @@
package survey
import (
"fmt"
"github.com/kercylan98/minotaur/utils/super"
"strings"
)
@ -9,10 +10,24 @@ func newReport(analyzer *Analyzer) *Report {
report := &Report{
analyzer: analyzer,
Name: "ROOT",
Values: analyzer.v,
Values: make(map[string]any),
Counter: analyzer.vc,
Subs: make([]*Report, 0, len(analyzer.subs)),
}
for k, v := range analyzer.v {
if format, exist := analyzer.format[k]; exist {
func() {
defer func() {
if err := recover(); err != nil {
panic(fmt.Errorf("format key[%s] value[%v] error: %v", k, v, err))
}
}()
report.Values[k] = format(v)
}()
continue
}
report.Values[k] = v
}
for k, v := range analyzer.subs {
sub := newReport(v)
sub.Name = k