mirror of
https://github.com/cgrates/cgrates.git
synced 2026-02-11 18:16:24 +05:00
128 lines
3.4 KiB
Go
128 lines
3.4 KiB
Go
/*
|
|
Real-time Online/Offline Charging System (OCS) for Telecom & ISP environments
|
|
Copyright (C) ITsysCOM GmbH
|
|
|
|
This program is free software: you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation, either version 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>
|
|
*/
|
|
|
|
package utils
|
|
|
|
import (
|
|
"fmt"
|
|
"strconv"
|
|
"strings"
|
|
)
|
|
|
|
type DynamicBlockers []*DynamicBlocker
|
|
|
|
// NewDynamicBlockersFromString will build the Blockers that contains slices of FilterIDs and Blocker from a single value. This process is helped by separators
|
|
func NewDynamicBlockersFromString(value, blkSep, fltrSep string) (blkrs DynamicBlockers, err error) {
|
|
if len(value) == 0 {
|
|
return DynamicBlockers{{}}, nil
|
|
}
|
|
valSeparated := strings.Split(value, blkSep)
|
|
lenVals := len(valSeparated)
|
|
if lenVals%2 != 0 {
|
|
return nil, fmt.Errorf("invalid DynamicBlocker format for string <%s>", value)
|
|
}
|
|
for idx := 0; idx < lenVals; idx += 2 {
|
|
var fltrIDs []string
|
|
if len(valSeparated[idx]) != 0 {
|
|
fltrIDs = strings.Split(valSeparated[idx], fltrSep)
|
|
}
|
|
var blocker bool
|
|
if len(valSeparated[idx+1]) != 0 {
|
|
if blocker, err = strconv.ParseBool(valSeparated[idx+1]); err != nil {
|
|
return nil, fmt.Errorf("cannot convert bool with value: <%v> into Blocker", valSeparated[idx+1])
|
|
}
|
|
}
|
|
blkrs = append(blkrs, &DynamicBlocker{FilterIDs: fltrIDs, Blocker: blocker})
|
|
}
|
|
return
|
|
}
|
|
|
|
// String will set the Blockers as a string pattern
|
|
func (blkrs DynamicBlockers) String(blkSep, fltrSep string) (value string) {
|
|
if len(blkrs) == 0 {
|
|
return
|
|
}
|
|
strBlockers := make([]string, len(blkrs))
|
|
for idx, val := range blkrs {
|
|
strBlockers[idx] = val.String(blkSep, fltrSep)
|
|
}
|
|
return strings.Join(strBlockers, blkSep)
|
|
}
|
|
|
|
type DynamicBlocker struct {
|
|
FilterIDs []string
|
|
Blocker bool
|
|
}
|
|
|
|
// String will set the DynamicBlocker as a string pattern
|
|
func (blckr DynamicBlocker) String(blkSep, fltrSep string) (out string) {
|
|
blocker := "false"
|
|
if blckr.Blocker {
|
|
blocker = "true"
|
|
}
|
|
return strings.Join(blckr.FilterIDs, fltrSep) + blkSep + blocker
|
|
}
|
|
|
|
func (dB *DynamicBlocker) FieldAsInterface(fldPath []string) (any, error) {
|
|
if len(fldPath) != 1 {
|
|
return nil, ErrNotFound
|
|
}
|
|
switch fldPath[0] {
|
|
case FilterIDs:
|
|
return dB.FilterIDs, nil
|
|
case Blocker:
|
|
return dB.Blocker, nil
|
|
default:
|
|
fld, idx := GetPathIndex(fldPath[0])
|
|
if idx != nil &&
|
|
fld == FilterIDs {
|
|
if *idx < len(dB.FilterIDs) {
|
|
return dB.FilterIDs[*idx], nil
|
|
}
|
|
}
|
|
}
|
|
return nil, ErrNotFound
|
|
}
|
|
|
|
// Clone will clone the Blockers
|
|
func (blckrs DynamicBlockers) Clone() (clBlkrs DynamicBlockers) {
|
|
if blckrs == nil {
|
|
return
|
|
}
|
|
clBlkrs = make(DynamicBlockers, len(blckrs))
|
|
for i, value := range blckrs {
|
|
clBlkrs[i] = value.Clone()
|
|
}
|
|
return
|
|
}
|
|
|
|
// Clone will clone the a DynamicBlocker
|
|
func (blckr *DynamicBlocker) Clone() (cln *DynamicBlocker) {
|
|
if blckr == nil {
|
|
return
|
|
}
|
|
cln = &DynamicBlocker{
|
|
Blocker: blckr.Blocker,
|
|
}
|
|
if blckr.FilterIDs != nil {
|
|
cln.FilterIDs = make([]string, len(blckr.FilterIDs))
|
|
copy(cln.FilterIDs, blckr.FilterIDs)
|
|
}
|
|
return
|
|
}
|