Создано с помощью ❤︎ от Hiukky
Grule — это минимальный механизм проверки условий на соответствие значениям с использованием схемы JSON. Его основная цель — работать как механизм Rete и выполнять все операции оперативно и просто.
npm i grule
yarn add grule
Чтобы настроить схему правил, просто выполните следующие действия.
Чтобы создать тестовый экземпляр, вам понадобится множество фактов для работы движка.
// Import Engine
import { Grule } from 'grule'
// Create an type
type IUser = {
id : number
name : string
}
// Create metadata
const metadata : IUser = {
id : 3 ,
name : 'test' ,
}
// Create instance
const grule = new Grule < IUser > ( metadata )
После создания экземпляра движка, предварительной загрузки фактов, следующим шагом будет регистрация правил. Чтобы зарегистрировать правила, необходимо импортировать интерфейс IRules <T>
и создать набор правил для атрибутов, объявленных в фактах.
Правила следуют структуре данных, заявленных в фактах. Для каждого атрибута будет выполняться правило.
Функция создания правил предлагает 2 аргумента: первый — attributes
, а второй — events
.
Вы можете использовать логическое выражение для каждого теста и выполнять нужное действие или использовать событие when
и then
для тестирования и выполнения действия на основе результата. Это хороший вариант для динамического тестирования.
После создания экземпляра и регистрации правил вы можете просто выполнить метод run, передав правила, определенные в качестве параметра. В конце тестов, если нет ошибок, прерывающих ход тестов, будет возвращено логическое значение.
true
все условия прошли.false
одно или все условия не выполнены. // ... Previous code
// Create Rules
const rules : IRules < IUser > = ( { id , name } , { when } ) => ( {
id : when ( id . diff ( 1 ) ) . then ( ( ) => {
throw new Error ( 'User not allowed.' )
} ) ,
name : name . in ( [ 'foo' , 'test' ] ) ,
} )
// Enroll rules
grule . run ( rules )
Вы также можете упростить предыдущий процесс более понятным способом. (Пример окончательного кода)
// Import Engine
import { Grule } from 'grule'
// Create an type
type IUser = {
id : number
name : string
}
// Create instance
new Grule < IUser > ( {
id : 3 ,
name : 'test' ,
} ) . run ( ( { id , name } , { when } ) => ( {
id : when ( id . diff ( 1 ) ) . then ( ( ) => {
throw new Error ( 'User not allowed.' )
} ) ,
name : name . in ( [ 'foo' , 'test' ] ) ,
} ) )
Каждый атрибут имеет 9 методов, доступных для тестов.
// Type: less(value: ILess): boolean
// Acceptable: ['number', 'bigint']
// Type: lessOrEqual(value: ILess): boolean
// Acceptable: ['number', 'bigint']
// Type: greater(value: IGreater): boolean
// Acceptable: ['number', 'bigint']
// Type: greaterOrEqual(value: IGreater): boolean
// Acceptable: ['number', 'bigint']
// Type: equal(value: IEqual): boolean
// Acceptable: ['bigint', 'boolean', 'number', 'string', 'date']
// Type: diff(value: IEqual): boolean
// Acceptable: ['bigint', 'boolean', 'number', 'string', 'date']
// Type: in(value: In): boolean
// Acceptable: ['bigint', 'boolean', 'number', 'string', 'array']
// Type: notIn(value: In): boolean
// Acceptable: ['bigint', 'boolean', 'number', 'string', 'array']
// Type: eval(operator: IOperatorsList, arg1: A): boolean
// Acceptable: [Idle]
В настоящее время у Grule есть только одно событие, чем when
. Он возвращает обещание с логическим результатом выполненного теста.
// Type: when(test: boolean): Promise<boolean>
// Acceptable: ['boolean']
Grule находится в начальной версии и пока не имеет многих функций, но вы можете смело отправлять свои предложения или открывать PR.