forked from TrueCloudLab/policy-engine
153 lines
2.8 KiB
Go
153 lines
2.8 KiB
Go
package chain
|
|
|
|
import (
|
|
"fmt"
|
|
"strconv"
|
|
|
|
jlexer "github.com/mailru/easyjson/jlexer"
|
|
jwriter "github.com/mailru/easyjson/jwriter"
|
|
)
|
|
|
|
// Run `make generate`` if types added or changed
|
|
|
|
var matchTypeToJSONValue = []struct {
|
|
mt MatchType
|
|
str string
|
|
}{
|
|
{MatchTypeDenyPriority, "DenyPriority"},
|
|
{MatchTypeFirstMatch, "FirstMatch"},
|
|
}
|
|
|
|
var statusToJSONValue = []struct {
|
|
s Status
|
|
str string
|
|
}{
|
|
{Allow, "Allow"},
|
|
{NoRuleFound, "NoRuleFound"},
|
|
{AccessDenied, "AccessDenied"},
|
|
{QuotaLimitReached, "QuotaLimitReached"},
|
|
}
|
|
|
|
var objectTypeToJSONValue = []struct {
|
|
t ObjectType
|
|
str string
|
|
}{
|
|
{ObjectRequest, "Request"},
|
|
{ObjectResource, "Resource"},
|
|
}
|
|
|
|
func (mt MatchType) MarshalEasyJSON(w *jwriter.Writer) {
|
|
for _, p := range matchTypeToJSONValue {
|
|
if p.mt == mt {
|
|
w.String(p.str)
|
|
return
|
|
}
|
|
}
|
|
w.String(strconv.FormatUint(uint64(mt), 10))
|
|
}
|
|
|
|
func (mt *MatchType) UnmarshalEasyJSON(l *jlexer.Lexer) {
|
|
str := l.String()
|
|
for _, p := range matchTypeToJSONValue {
|
|
if p.str == str {
|
|
*mt = p.mt
|
|
return
|
|
}
|
|
}
|
|
|
|
v, err := strconv.ParseUint(str, 10, 8)
|
|
if err != nil {
|
|
l.AddError(fmt.Errorf("failed to parse match type: %w", err))
|
|
return
|
|
}
|
|
*mt = MatchType(v)
|
|
}
|
|
|
|
func (st Status) MarshalEasyJSON(w *jwriter.Writer) {
|
|
for _, p := range statusToJSONValue {
|
|
if p.s == st {
|
|
w.String(p.str)
|
|
return
|
|
}
|
|
}
|
|
w.String(strconv.FormatUint(uint64(st), 10))
|
|
}
|
|
|
|
func (st *Status) UnmarshalEasyJSON(l *jlexer.Lexer) {
|
|
str := l.String()
|
|
for _, p := range statusToJSONValue {
|
|
if p.str == str {
|
|
*st = p.s
|
|
return
|
|
}
|
|
}
|
|
|
|
v, err := strconv.ParseUint(str, 10, 8)
|
|
if err != nil {
|
|
l.AddError(fmt.Errorf("failed to parse status: %w", err))
|
|
return
|
|
}
|
|
*st = Status(v)
|
|
}
|
|
|
|
func (ot ObjectType) MarshalEasyJSON(w *jwriter.Writer) {
|
|
for _, p := range objectTypeToJSONValue {
|
|
if p.t == ot {
|
|
w.String(p.str)
|
|
return
|
|
}
|
|
}
|
|
w.String(strconv.FormatUint(uint64(ot), 10))
|
|
}
|
|
|
|
func (ot *ObjectType) UnmarshalEasyJSON(l *jlexer.Lexer) {
|
|
str := l.String()
|
|
for _, p := range objectTypeToJSONValue {
|
|
if p.str == str {
|
|
*ot = p.t
|
|
return
|
|
}
|
|
}
|
|
|
|
v, err := strconv.ParseUint(str, 10, 8)
|
|
if err != nil {
|
|
l.AddError(fmt.Errorf("failed to parse object type: %w", err))
|
|
return
|
|
}
|
|
*ot = ObjectType(v)
|
|
}
|
|
|
|
func (ct ConditionType) MarshalEasyJSON(w *jwriter.Writer) {
|
|
for _, p := range condToStr {
|
|
if p.ct == ct {
|
|
w.String(p.str)
|
|
return
|
|
}
|
|
}
|
|
w.String(strconv.FormatUint(uint64(ct), 10))
|
|
}
|
|
|
|
func (ct *ConditionType) UnmarshalEasyJSON(l *jlexer.Lexer) {
|
|
str := l.String()
|
|
for _, p := range condToStr {
|
|
if p.str == str {
|
|
*ct = p.ct
|
|
return
|
|
}
|
|
}
|
|
|
|
v, err := strconv.ParseUint(str, 10, 8)
|
|
if err != nil {
|
|
l.AddError(fmt.Errorf("failed to parse condition type: %w", err))
|
|
return
|
|
}
|
|
*ct = ConditionType(v)
|
|
}
|
|
|
|
func (id ID) MarshalEasyJSON(w *jwriter.Writer) {
|
|
w.Base64Bytes([]byte(id))
|
|
}
|
|
|
|
func (id *ID) UnmarshalEasyJSON(l *jlexer.Lexer) {
|
|
*id = ID(l.Bytes())
|
|
}
|