增加搜索,TODO : 完成check rule

This commit is contained in:
白茶清欢 2021-11-24 23:04:26 +08:00
parent 0d9fa31401
commit 04592e840f

View File

@ -0,0 +1,99 @@
// Package apollo...
//
// Description : apollo...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 2021-11-24 10:26 下午
package apollo
import (
"encoding/json"
"errors"
"git.zhangdeman.cn/zhangdeman/gopkg/util"
)
const (
// OperateTypeIs 固定值
OperateTypeIs = "is"
// OperateTypeIn 在指定枚举值中
OperateTypeIn = "in"
// OperateTypeNotIn 不在指定枚举值中
OperateTypeNotIn = "not_in"
// OperateGt 大于
OperateGt = "gt"
// OperateGte 大于等于
OperateGte = "gte"
// OperateLt 小于
OperateLt = "lt"
// OperateLte 小于等于
OperateLte = "lte"
)
// Rule 数据过滤规则
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 10:32 下午 2021/11/24
type Rule struct {
Name string `json:"name"` // 规则名称
ConditionList []Condition `json:"condition_list"` // 条件列表
Data map[string]interface{} `json:"data"` // 满足条件时返回的数据
}
// Condition 条件处理
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 10:27 下午 2021/11/24
type Condition struct {
InputKey string `json:"input_key"` // 从输入数据中读取的key
Operate string `json:"operate"` // 操作
TargetValue string `json:"target_value"` // 目标值
}
// Search 搜索key并按照指定条件过滤
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 11:01 下午 2021/11/24
func Search(key string, inputData map[string]interface{}, receiver interface{}) error {
if nil == receiver {
return errors.New("receiver is nil")
}
if nil == inputData {
inputData = make(map[string]interface{})
}
var (
readResult string
err error
formatResult []Rule
)
if readResult = Client.GetStringValue(key, ""); len(readResult) == 0 {
return errors.New("key is not found : " + key)
}
if err = json.Unmarshal([]byte(readResult), &formatResult); nil != err {
return errors.New("parse read config fail : " + err.Error())
}
for _, rule := range formatResult {
if checkRule(rule, inputData) {
byteData, mErr := json.Marshal(rule.Data)
if nil != mErr {
return mErr
}
// 命中规则, 返回数据
return util.JSONUnmarshalWithNumber(byteData, receiver)
}
}
return nil
}
// checkRule 检测数据是否命中规则
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 10:59 下午 2021/11/24
func checkRule(rule Rule, inputData map[string]interface{}) bool {
return true
}