73 lines
1.2 KiB
Go
73 lines
1.2 KiB
Go
package rules
|
|
|
|
import (
|
|
"fmt"
|
|
"strconv"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
)
|
|
|
|
type RuleFunction func(*gin.Context) (bool, []error)
|
|
|
|
const (
|
|
ALL_RULES_MUST_BE_COMPLETED = iota
|
|
)
|
|
|
|
func CheckRule(
|
|
c *gin.Context,
|
|
ruleChecker RuleFunction,
|
|
) (bool, []error) {
|
|
IsAllowed, err := ruleChecker(c)
|
|
if err != nil {
|
|
return false, err
|
|
}
|
|
|
|
return IsAllowed, nil
|
|
}
|
|
|
|
func CheckRules(
|
|
c *gin.Context,
|
|
rules []RuleFunction,
|
|
completedRulesCount int,
|
|
) (bool, []error) {
|
|
var allowancesIndexes []int
|
|
var errors []error
|
|
|
|
if len(rules) < completedRulesCount {
|
|
return false, []error{fmt.Errorf("there is less rules, that should be completed")}
|
|
}
|
|
|
|
for i, rule := range rules {
|
|
if isAllowed, err := CheckRule(c, rule); err != nil {
|
|
errors = append(
|
|
errors,
|
|
err...,
|
|
)
|
|
} else if !isAllowed {
|
|
errors = append(
|
|
errors,
|
|
fmt.Errorf("rule "+
|
|
strconv.Itoa(i)+
|
|
" was rejected"),
|
|
)
|
|
} else {
|
|
allowancesIndexes = append(allowancesIndexes, i)
|
|
}
|
|
}
|
|
|
|
switch completedRulesCount {
|
|
case ALL_RULES_MUST_BE_COMPLETED:
|
|
if len(allowancesIndexes) == len(rules) {
|
|
return true, nil
|
|
} else {
|
|
return false, errors
|
|
}
|
|
default:
|
|
if len(allowancesIndexes) >= completedRulesCount {
|
|
return true, nil
|
|
} else {
|
|
return false, errors
|
|
}
|
|
}
|
|
}
|