func()

in pkg/admin/services/traffic/region.go [56:104]


func (tm *RegionService) Search(r *model.Region) ([]*model.Region, error) {
	result := make([]*model.Region, 0)

	var con string
	if r.Service != "" && r.Service != "*" {
		con = util.ColonSeparatedKey(r.Service, r.Group, r.Version)
	}

	list, err := services.GetRules(con, constant.ConditionRuleSuffix)
	if err != nil {
		return result, err
	}

	for k, v := range list {
		k, _ = strings.CutSuffix(k, constant.ConditionRuleSuffix)
		split := strings.Split(k, ":")
		region := &model.Region{
			Service: split[0],
		}
		if len(split) >= 2 {
			region.Version = split[1]
		}
		if len(split) >= 3 {
			region.Group = split[2]
		}

		route := &model.ConditionRoute{}
		err = yaml.Unmarshal([]byte(v), route)
		if err != nil {
			return result, err
		}
		for _, c := range route.Conditions {
			// fixme, regex match
			if strings.Contains(c, model.RegionAdminIdentifier) {
				i := strings.Index(c, "=$")
				if i > 3 {
					region.Rule = strings.TrimSpace(c[3:i])
					break
				}
			}
		}

		if region.Rule != "" {
			result = append(result, region)
		}
	}

	return result, nil
}