Este pacote foi criado com inspiração no governante de Thomas para executar um conjunto simples de regras contra uma entidade.
Esta versão inclui mais alguns recursos, incluindo compostos AND e OR e a capacidade de adicionar comparadores personalizados.
Nota : Este pacote compara apenas dois tipos: string
e float64
, isso funciona bem com encoding/json
.
// Create a new instance of an engine with some default comparators
e , err := NewJSONEngine ( json . RawMessage ( `{"composites":[{"operator":"or","rules":[{"comparator":"always-false","path":"user.name","value":"Trevor"},{"comparator":"eq","path":"user.name","value":"Trevor"}]}]}` ))
if err != nil {
panic ( err )
}
// Add a new, custom comparator
e = e . AddComparator ( "always-false" , func ( a , b interface {}) bool {
return false
})
// Give some properties, this map can be deeper and supports interfaces
props := map [ string ] interface {}{
"user" : map [ string ] interface {}{
"name" : "Trevor" ,
}
}
// Run the engine on the props
res := e . Evaluate ( props )
// res == true
eq
retornará verdadeiro se a == b
neq
retornará verdadeiro se a != b
lt
retornará verdadeiro se a < b
lte
retornará verdadeiro se a <= b
gt
retornará verdadeiro se a > b
gte
retornará verdadeiro se a >= b
contains
retornará verdadeiro se a
contiver b
ncontains
retornará verdadeiro se a
não contiver b
oneof
retornará verdadeiro se a
for um de b
noneof
retornará verdadeiro se a
não for um de b
regex
retornará verdadeiro se a
corresponder b
contains
e ncontains
funcionam para comparações de substring, bem como comparações de itens na coleção.
Quando usado para comparações de itens na coleção, contains
espera que o primeiro argumento seja uma fatia. contains
é diferente de oneof
porque oneof
espera que o segundo argumento seja uma fatia.
Referência | N | Velocidade | Usado | Alocações |
---|---|---|---|---|
ReferênciaEqual-12 | 650602549 | 5,52 ns/op | 0 B/op | 0 alocações/operações |
ReferênciaNotEqual-12 | 876894124 | 4,09 ns/op | 0 B/op | 0 alocações/operações |
ReferênciaLessThan-12 | 1000000000 | 2,84 ns/op | 0 B/op | 0 alocações/operações |
ReferênciaLessThanEqual-12 | 1000000000 | 2,57 ns/op | 0 B/op | 0 alocações/operações |
Referência maior que 12 | 1000000000 | 2,07 ns/op | 0 B/op | 0 alocações/operações |
ReferênciaMaiorThanEqual-12 | 1000000000 | 2,86 ns/op | 0 B/op | 0 alocações/operações |
ReferênciaRegex-12 | 4524237 | 793 ns/operacional | 753 B/operacional | 11 alocações/operações |
ReferênciaRegexPhone-12 | 1.000.000 | 3338 ns/operacional | 3199 B/operacional | 30 alocações/operação |
ReferênciaContém-12 | 499627219 | 7,16 ns/op | 0 B/op | 0 alocações/operações |
BenchmarkStringContains-12 | 405497102 | 8,87 ns/op | 0 B/op | 0 alocações/operações |
ReferênciaContémLong50000-12 | 18992 | 184016 ns/op | 0 B/op | 0 alocações/operações |
ReferênciaNotContains-12 | 292932907 | 12,3 ns/op | 0 B/op | 0 alocações/operações |
BenchmarkStringNotContains-12 | 392618857 | 9,14 ns/op | 0 B/op | 0 alocações/operações |
ReferênciaNotContainsLong50000-12 | 19243 | 191787 ns/op | 0 B/op | 0 alocações/operações |
ReferênciaUmDe-12 | 1000000000 | 1,80 ns/op | 0 B/op | 0 alocações/operações |
ReferênciaNoneOf-12 | 1000000000 | 1,79 ns/op | 0 B/op | 0 alocações/operações |
ReferênciaPluckShallow-12 | 85997188 | 41,6 ns/op | 16 B/op | 1 alocação/operação |
ReferênciaPluckDeep-12 | 18789103 | 194 ns/op | 112 B/op | 1 alocação/operação |
BenchmarkRule_evaluate-12 | 69558996 | 51,1 ns/op | 16 B/op | 1 alocação/operação |
BenchmarkComposite_evaluate-12 | 59484760 | 55,7 ns/op | 16 B/op | 1 alocação/operação |
BenchmarkEngine_Evaluate-12 | 47892318 | 75,0 ns/op | 16 B/op | 1 alocação/operação |
Para executar benchmarks:
go test -run none -bench . -benchtime 3s -benchmem
Todos os benchmarks foram executados em:
MacOS High Sierra 2,6 GHz Intel Core i7 16 GB 2400 MHz DDR4
Direitos autorais © 2019 Trevor Hutto
Licenciado sob a Licença Apache, Versão 2.0 (a "Licença"); você não pode usar esta obra exceto em conformidade com a Licença. Você pode obter uma cópia da Licença no arquivo LICENSE ou em:
http://www.apache.org/licenses/LICENSE-2.0
A menos que exigido pela lei aplicável ou acordado por escrito, o software distribuído sob a Licença é distribuído "COMO ESTÁ", SEM GARANTIAS OU CONDIÇÕES DE QUALQUER TIPO, expressas ou implícitas. Consulte a Licença para saber o idioma específico que rege as permissões e limitações da Licença.