package stats
import (
"fmt"
"sync/atomic"
"github.com/logrusorgru/aurora"
"github.com/projectdiscovery/gologger"
mapsutil "github.com/projectdiscovery/utils/maps"
)
type Storage struct {
data *mapsutil.SyncLockMap[string, *storageDataItem]
}
type storageDataItem struct {
description string
value atomic.Int64
}
var Default *Storage
func init() {
Default = New()
}
func NewEntry(name, description string) {
Default.NewEntry(name, description)
}
func Increment(name string) {
Default.Increment(name)
}
func Display(name string) {
Default.Display(name)
}
func DisplayAsWarning(name string) {
Default.DisplayAsWarning(name)
}
func ForceDisplayWarning(name string) {
Default.ForceDisplayWarning(name)
}
func GetValue(name string) int64 {
return Default.GetValue(name)
}
func New() *Storage {
data := mapsutil.NewSyncLockMap[string, *storageDataItem]()
return &Storage{data: data}
}
func (s *Storage) NewEntry(name, description string) {
_ = s.data.Set(name, &storageDataItem{description: description, value: atomic.Int64{}})
}
func (s *Storage) Increment(name string) {
data, ok := s.data.Get(name)
if !ok {
return
}
data.value.Add(1)
}
func (s *Storage) Display(name string) {
data, ok := s.data.Get(name)
if !ok {
return
}
dataValue := data.value.Load()
if dataValue == 0 {
return
}
gologger.Error().Label("WRN").Msgf(data.description, dataValue)
}
func (s *Storage) DisplayAsWarning(name string) {
data, ok := s.data.Get(name)
if !ok {
return
}
dataValue := data.value.Load()
if dataValue == 0 {
return
}
gologger.Warning().Label("WRN").Msgf(data.description, dataValue)
}
func (s *Storage) ForceDisplayWarning(name string) {
data, ok := s.data.Get(name)
if !ok {
return
}
dataValue := data.value.Load()
if dataValue == 0 {
return
}
gologger.Print().Msgf("[%v] %v", aurora.BrightYellow("WRN"), fmt.Sprintf(data.description, dataValue))
}
func (s *Storage) GetValue(name string) int64 {
data, ok := s.data.Get(name)
if !ok {
return 0
}
return data.value.Load()
}