mirror of
https://github.com/MetaCubeX/mihomo.git
synced 2026-03-04 12:57:31 +00:00
feat: support rule disabling and hit/miss count/at tracking in restful api (#2502)
This commit is contained in:
72
rules/wrapper/wrapper.go
Normal file
72
rules/wrapper/wrapper.go
Normal file
@@ -0,0 +1,72 @@
|
||||
package wrapper
|
||||
|
||||
import (
|
||||
"time"
|
||||
|
||||
"github.com/metacubex/mihomo/common/atomic"
|
||||
C "github.com/metacubex/mihomo/constant"
|
||||
)
|
||||
|
||||
type RuleWrapper struct {
|
||||
C.Rule
|
||||
disabled atomic.Bool
|
||||
hitCount atomic.Uint64
|
||||
hitAt atomic.TypedValue[time.Time]
|
||||
missCount atomic.Uint64
|
||||
missAt atomic.TypedValue[time.Time]
|
||||
}
|
||||
|
||||
func (r *RuleWrapper) IsDisabled() bool {
|
||||
return r.disabled.Load()
|
||||
}
|
||||
|
||||
func (r *RuleWrapper) SetDisabled(v bool) {
|
||||
r.disabled.Store(v)
|
||||
}
|
||||
|
||||
func (r *RuleWrapper) HitCount() uint64 {
|
||||
return r.hitCount.Load()
|
||||
}
|
||||
|
||||
func (r *RuleWrapper) HitAt() time.Time {
|
||||
return r.hitAt.Load()
|
||||
}
|
||||
|
||||
func (r *RuleWrapper) MissCount() uint64 {
|
||||
return r.missCount.Load()
|
||||
}
|
||||
|
||||
func (r *RuleWrapper) MissAt() time.Time {
|
||||
return r.missAt.Load()
|
||||
}
|
||||
|
||||
func (r *RuleWrapper) Unwrap() C.Rule {
|
||||
return r.Rule
|
||||
}
|
||||
|
||||
func (r *RuleWrapper) Hit() {
|
||||
r.hitCount.Add(1)
|
||||
r.hitAt.Store(time.Now())
|
||||
}
|
||||
|
||||
func (r *RuleWrapper) Miss() {
|
||||
r.missCount.Add(1)
|
||||
r.missAt.Store(time.Now())
|
||||
}
|
||||
|
||||
func (r *RuleWrapper) Match(metadata *C.Metadata, helper C.RuleMatchHelper) (bool, string) {
|
||||
if r.IsDisabled() {
|
||||
return false, ""
|
||||
}
|
||||
ok, adapter := r.Rule.Match(metadata, helper)
|
||||
if ok {
|
||||
r.Hit()
|
||||
} else {
|
||||
r.Miss()
|
||||
}
|
||||
return ok, adapter
|
||||
}
|
||||
|
||||
func NewRuleWrapper(rule C.Rule) C.RuleWrapper {
|
||||
return &RuleWrapper{Rule: rule}
|
||||
}
|
||||
Reference in New Issue
Block a user