feat: survey 包支持对报告字段进行格式化处理
This commit is contained in:
parent
5c954f0c2a
commit
ed5be97234
|
@ -8,13 +8,13 @@ import (
|
||||||
// DataMeta 全局活动数据
|
// DataMeta 全局活动数据
|
||||||
type DataMeta[Data any] struct {
|
type DataMeta[Data any] struct {
|
||||||
once sync.Once
|
once sync.Once
|
||||||
Data Data `json:"data,omitempty"` // 活动数据
|
Data Data `json:"data,omitempty"` // 活动数据
|
||||||
LastNewDay time.Time `json:"lastNewDay,omitempty"` // 上次跨天时间
|
LastNewDay time.Time `json:"last_new_day,omitempty"` // 上次跨天时间
|
||||||
}
|
}
|
||||||
|
|
||||||
// EntityDataMeta 活动实体数据
|
// EntityDataMeta 活动实体数据
|
||||||
type EntityDataMeta[Data any] struct {
|
type EntityDataMeta[Data any] struct {
|
||||||
once sync.Once
|
once sync.Once
|
||||||
Data Data `json:"data,omitempty"` // 活动数据
|
Data Data `json:"data,omitempty"` // 活动数据
|
||||||
LastNewDay time.Time `json:"lastNewDay,omitempty"` // 上次跨天时间
|
LastNewDay time.Time `json:"last_new_day,omitempty"` // 上次跨天时间
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,6 +12,7 @@ type Analyzer struct {
|
||||||
vc map[string]int64 // 记录了每个 key 生效的计数数量
|
vc map[string]int64 // 记录了每个 key 生效的计数数量
|
||||||
repeat map[string]struct{} // 去重信息
|
repeat map[string]struct{} // 去重信息
|
||||||
subs map[string]*Analyzer
|
subs map[string]*Analyzer
|
||||||
|
format map[string]func(v any) any // 格式化函数
|
||||||
m sync.Mutex
|
m sync.Mutex
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -30,6 +31,16 @@ func (slf *Analyzer) Sub(key string) *Analyzer {
|
||||||
return sub
|
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 的值,当新值大于旧值时
|
// SetValueIfGreaterThan 设置指定 key 的值,当新值大于旧值时
|
||||||
// - 当已有值不为 float64 时,将会被忽略
|
// - 当已有值不为 float64 时,将会被忽略
|
||||||
func (slf *Analyzer) SetValueIfGreaterThan(key string, value float64) {
|
func (slf *Analyzer) SetValueIfGreaterThan(key string, value float64) {
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
package survey
|
package survey
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
"github.com/kercylan98/minotaur/utils/super"
|
"github.com/kercylan98/minotaur/utils/super"
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
@ -9,10 +10,24 @@ func newReport(analyzer *Analyzer) *Report {
|
||||||
report := &Report{
|
report := &Report{
|
||||||
analyzer: analyzer,
|
analyzer: analyzer,
|
||||||
Name: "ROOT",
|
Name: "ROOT",
|
||||||
Values: analyzer.v,
|
Values: make(map[string]any),
|
||||||
Counter: analyzer.vc,
|
Counter: analyzer.vc,
|
||||||
Subs: make([]*Report, 0, len(analyzer.subs)),
|
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 {
|
for k, v := range analyzer.subs {
|
||||||
sub := newReport(v)
|
sub := newReport(v)
|
||||||
sub.Name = k
|
sub.Name = k
|
||||||
|
|
Loading…
Reference in New Issue