@@ -24,9 +24,13 @@ func SetTunnel(t P.Tunnel) {
24
24
}
25
25
26
26
type ruleSetProvider struct {
27
+ ruleSetProviderBase
27
28
* resource.Fetcher [ruleStrategy ]
29
+ format P.RuleFormat
30
+ }
31
+
32
+ type ruleSetProviderBase struct {
28
33
behavior P.RuleBehavior
29
- format P.RuleFormat
30
34
strategy ruleStrategy
31
35
}
32
36
@@ -61,7 +65,7 @@ type mrsRuleStrategy interface {
61
65
DumpMrs (f func (key string ) bool )
62
66
}
63
67
64
- func (rp * ruleSetProvider ) Type () P.ProviderType {
68
+ func (rp * ruleSetProviderBase ) Type () P.ProviderType {
65
69
return P .Rule
66
70
}
67
71
@@ -75,40 +79,51 @@ func (rp *ruleSetProvider) Update() error {
75
79
return err
76
80
}
77
81
78
- func (rp * ruleSetProvider ) Behavior () P.RuleBehavior {
82
+ func (rp * ruleSetProviderBase ) Behavior () P.RuleBehavior {
79
83
return rp .behavior
80
84
}
81
85
82
- func (rp * ruleSetProvider ) Count () int {
86
+ func (rp * ruleSetProviderBase ) Count () int {
83
87
return rp .strategy .Count ()
84
88
}
85
89
86
- func (rp * ruleSetProvider ) Match (metadata * C.Metadata ) bool {
90
+ func (rp * ruleSetProviderBase ) Match (metadata * C.Metadata ) bool {
87
91
return rp .strategy != nil && rp .strategy .Match (metadata )
88
92
}
89
93
90
- func (rp * ruleSetProvider ) ShouldResolveIP () bool {
94
+ func (rp * ruleSetProviderBase ) ShouldResolveIP () bool {
91
95
return rp .strategy .ShouldResolveIP ()
92
96
}
93
97
94
- func (rp * ruleSetProvider ) ShouldFindProcess () bool {
98
+ func (rp * ruleSetProviderBase ) ShouldFindProcess () bool {
95
99
return rp .strategy .ShouldFindProcess ()
96
100
}
97
101
98
- func (rp * ruleSetProvider ) Strategy () any {
102
+ func (rp * ruleSetProviderBase ) Strategy () any {
99
103
return rp .strategy
100
104
}
101
105
106
+ type providerForApi struct {
107
+ Behavior string `json:"behavior"`
108
+ Format string `json:"format"`
109
+ Name string `json:"name"`
110
+ RuleCount int `json:"ruleCount"`
111
+ Type string `json:"type"`
112
+ VehicleType string `json:"vehicleType"`
113
+ UpdatedAt time.Time `json:"updatedAt"`
114
+ Payload []string `json:"payload,omitempty"`
115
+ }
116
+
102
117
func (rp * ruleSetProvider ) MarshalJSON () ([]byte , error ) {
103
118
return json .Marshal (
104
- map [ string ] interface {} {
105
- "behavior" : rp .behavior .String (),
106
- "format" : rp .format .String (),
107
- "name" : rp .Name (),
108
- "ruleCount" : rp .strategy .Count (),
109
- "type" : rp .Type ().String (),
110
- "updatedAt" : rp .UpdatedAt (),
111
- "vehicleType" : rp .VehicleType ().String (),
119
+ providerForApi {
120
+ Behavior : rp .behavior .String (),
121
+ Format : rp .format .String (),
122
+ Name : rp . Fetcher .Name (),
123
+ RuleCount : rp .strategy .Count (),
124
+ Type : rp .Type ().String (),
125
+ UpdatedAt : rp .UpdatedAt (),
126
+ VehicleType : rp .VehicleType ().String (),
112
127
})
113
128
}
114
129
@@ -118,10 +133,13 @@ func (rp *RuleSetProvider) Close() error {
118
133
}
119
134
120
135
func NewRuleSetProvider (name string , behavior P.RuleBehavior , format P.RuleFormat , interval time.Duration , vehicle P.Vehicle ,
121
- parse func (tp , payload , target string , params []string , subRules map [string ][]C.Rule ) (parsed C.Rule , parseErr error )) P.RuleProvider {
136
+ parse parseRuleFunc ,
137
+ ) P.RuleProvider {
122
138
rp := & ruleSetProvider {
123
- behavior : behavior ,
124
- format : format ,
139
+ ruleSetProviderBase : ruleSetProviderBase {
140
+ behavior : behavior ,
141
+ },
142
+ format : format ,
125
143
}
126
144
127
145
onUpdate := func (strategy ruleStrategy ) {
@@ -142,7 +160,7 @@ func NewRuleSetProvider(name string, behavior P.RuleBehavior, format P.RuleForma
142
160
return wrapper
143
161
}
144
162
145
- func newStrategy (behavior P.RuleBehavior , parse func ( tp , payload , target string , params [] string , subRules map [ string ][]C. Rule ) ( parsed C. Rule , parseErr error ) ) ruleStrategy {
163
+ func newStrategy (behavior P.RuleBehavior , parse parseRuleFunc ) ruleStrategy {
146
164
switch behavior {
147
165
case P .Domain :
148
166
strategy := NewDomainStrategy ()
@@ -158,8 +176,10 @@ func newStrategy(behavior P.RuleBehavior, parse func(tp, payload, target string,
158
176
}
159
177
}
160
178
161
- var ErrNoPayload = errors .New ("file must have a `payload` field" )
162
- var ErrInvalidFormat = errors .New ("invalid format" )
179
+ var (
180
+ ErrNoPayload = errors .New ("file must have a `payload` field" )
181
+ ErrInvalidFormat = errors .New ("invalid format" )
182
+ )
163
183
164
184
func rulesParse (buf []byte , strategy ruleStrategy , format P.RuleFormat ) (ruleStrategy , error ) {
165
185
strategy .Reset ()
@@ -254,3 +274,71 @@ func rulesParse(buf []byte, strategy ruleStrategy, format P.RuleFormat) (ruleStr
254
274
255
275
return strategy , nil
256
276
}
277
+
278
+ func rulesParseInline (rs []string , strategy ruleStrategy ) ruleStrategy {
279
+ strategy .Reset ()
280
+ for _ , r := range rs {
281
+ if r != "" {
282
+ strategy .Insert (r )
283
+ }
284
+ }
285
+ strategy .FinishInsert ()
286
+ return strategy
287
+ }
288
+
289
+ type inlineProvider struct {
290
+ ruleSetProviderBase
291
+ name string
292
+ updateTime time.Time
293
+ payload []string
294
+ }
295
+
296
+ func (i * inlineProvider ) Name () string {
297
+ return i .name
298
+ }
299
+
300
+ func (i * inlineProvider ) Initial () error {
301
+ return nil
302
+ }
303
+
304
+ func (i * inlineProvider ) Update () error {
305
+ // make api update happy
306
+ i .updateTime = time .Now ()
307
+ return nil
308
+ }
309
+
310
+ func (i * inlineProvider ) VehicleType () P.VehicleType {
311
+ return P .Inline
312
+ }
313
+
314
+ func (i * inlineProvider ) MarshalJSON () ([]byte , error ) {
315
+ return json .Marshal (
316
+ providerForApi {
317
+ Behavior : i .behavior .String (),
318
+ Name : i .Name (),
319
+ RuleCount : i .strategy .Count (),
320
+ Type : i .Type ().String (),
321
+ VehicleType : i .VehicleType ().String (),
322
+ UpdatedAt : i .updateTime ,
323
+ Payload : i .payload ,
324
+ })
325
+ }
326
+
327
+ func newInlineProvider (
328
+ name string ,
329
+ behavior P.RuleBehavior ,
330
+ payload []string ,
331
+ parse parseRuleFunc ,
332
+ ) P.RuleProvider {
333
+ rp := & inlineProvider {
334
+ ruleSetProviderBase : ruleSetProviderBase {
335
+ behavior : behavior ,
336
+ strategy : newStrategy (behavior , parse ),
337
+ },
338
+ payload : payload ,
339
+ name : name ,
340
+ updateTime : time .Now (),
341
+ }
342
+ rp .strategy = rulesParseInline (payload , rp .strategy )
343
+ return rp
344
+ }
0 commit comments