core/base/block_error.go (79 lines of code) (raw):

// Copyright 1999-2020 Alibaba Group Holding Ltd. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package base import "fmt" // BlockError indicates the request was blocked by Sentinel. type BlockError struct { blockType BlockType // blockMsg provides additional message for the block error. blockMsg string rule SentinelRule // snapshotValue represents the triggered "snapshot" value snapshotValue interface{} } type BlockErrorOption func(*BlockError) func WithBlockType(blockType BlockType) BlockErrorOption { return func(b *BlockError) { b.blockType = blockType } } func WithBlockMsg(blockMsg string) BlockErrorOption { return func(b *BlockError) { b.blockMsg = blockMsg } } func WithRule(rule SentinelRule) BlockErrorOption { return func(b *BlockError) { b.rule = rule } } func WithSnapshotValue(snapshotValue interface{}) BlockErrorOption { return func(b *BlockError) { b.snapshotValue = snapshotValue } } func NewBlockError(opts ...BlockErrorOption) *BlockError { b := &BlockError{ blockType: BlockTypeUnknown, } for _, opt := range opts { opt(b) } return b } func (e *BlockError) ResetBlockError(opts ...BlockErrorOption) { for _, opt := range opts { opt(e) } return } func (e *BlockError) BlockMsg() string { return e.blockMsg } func (e *BlockError) BlockType() BlockType { return e.blockType } func (e *BlockError) TriggeredRule() SentinelRule { return e.rule } func (e *BlockError) TriggeredValue() interface{} { return e.snapshotValue } func NewBlockErrorFromDeepCopy(from *BlockError) *BlockError { return &BlockError{ blockType: from.blockType, blockMsg: from.blockMsg, rule: from.rule, snapshotValue: from.snapshotValue, } } func NewBlockErrorWithMessage(blockType BlockType, message string) *BlockError { return NewBlockError(WithBlockType(blockType), WithBlockMsg(message)) } func NewBlockErrorWithCause(blockType BlockType, blockMsg string, rule SentinelRule, snapshot interface{}) *BlockError { return NewBlockError(WithBlockType(blockType), WithBlockMsg(blockMsg), WithRule(rule), WithSnapshotValue(snapshot)) } func (e *BlockError) Error() string { if e == nil { return "nil *BlockError" } if len(e.blockMsg) == 0 { return fmt.Sprintf("SentinelBlockError: %s", e.blockType.String()) } return fmt.Sprintf("SentinelBlockError: %s, message: %s", e.blockType.String(), e.blockMsg) }