Construido con ❤︎ por Hiukky
Grule es un mecanismo mínimo para probar condiciones frente a valores utilizando un esquema JSON. Su principal objetivo es funcionar como un mecanismo Rete y resolver todas las operaciones de forma performática y sencilla.
npm i grule
yarn add grule
Para configurar su esquema de reglas, simplemente siga los pasos a continuación.
Para crear una instancia de prueba, necesitará una gran cantidad de datos para impulsar el motor.
// 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 )
Después de crear una instancia del motor, precargarla con hechos, el siguiente paso es registrar las reglas. Para registrar las reglas, debe importar la interfaz IRules <T>
y crear un conjunto de reglas para los atributos declarados en los hechos.
Las reglas siguen la estructura de los datos declarados en los hechos. Para cada atributo se ejecutará una regla.
La función de creación de reglas ofrece 2 argumentos, siendo el primero los attributes
y el segundo los events
.
Puede usar una expresión lógica para cada prueba y realizar la acción que desee, o puede usar el evento when
y then
para probar y realizar una acción según el resultado. Esta es una buena opción para pruebas dinámicas.
Después de crear una instancia y registrar las reglas, simplemente puede ejecutar el método de ejecución pasando las reglas definidas como parámetro. Al finalizar las pruebas, si no hay ningún error que interrumpa el flujo de las pruebas, se devolverá un valor booleano.
true
todas las condiciones han pasado.false
una o todas las condiciones fallaron. // ... 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 )
También puedes simplificar el flujo anterior de una forma más limpia. (Ejemplo de código final)
// 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' ] ) ,
} ) )
Cada atributo tiene 9 métodos disponibles para las pruebas que hay.
// 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 actualmente tiene solo un evento que when
. Devuelve una promesa con un resultado booleano de la prueba realizada.
// Type: when(test: boolean): Promise<boolean>
// Acceptable: ['boolean']
Grule se encuentra en una versión inicial sin muchas funciones todavía, pero puedes enviar tu sugerencia o abrir un PR.