Construit avec ❤︎ par Hiukky
Grule est un mécanisme minimal permettant de tester des conditions par rapport à des valeurs à l'aide d'un schéma JSON. Son objectif principal est de fonctionner comme un mécanisme Rete et de résoudre toutes les opérations de manière simple et performante.
npm i grule
yarn add grule
Pour configurer votre système de règles, suivez simplement les étapes ci-dessous.
Pour créer une instance de test, vous aurez besoin d’une multitude de faits pour alimenter le moteur.
// 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 )
Après avoir créé une instance du moteur, préchargée avec des faits, l'étape suivante consiste à enregistrer les règles. Pour enregistrer les règles, vous devez importer l'interface IRules <T>
et créer un ensemble de règles pour les attributs déclarés dans les faits.
Les règles suivent la structure des données déclarées dans les faits. Pour chaque attribut, une règle sera exécutée.
La fonction de création de règles propose 2 arguments, le premier étant les attributes
et le second les events
.
Vous pouvez utiliser une expression logique pour chaque test et effectuer une action souhaitée, ou vous pouvez utiliser l'événement when
et then
pour tester et effectuer une action en fonction du résultat. C'est une bonne option pour les tests dynamiques.
Après avoir créé une instance et enregistré les règles, vous pouvez simplement exécuter la méthode run en passant les règles définies en paramètre. A la fin des tests, si aucune erreur n'interrompt le déroulement des tests, une valeur booléenne sera renvoyée.
true
toutes les conditions sont remplies.false
une ou toutes les conditions ont échoué. // ... 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 )
Vous pouvez également simplifier le flux précédent de manière plus propre. (Exemple de code 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' ] ) ,
} ) )
Chaque attribut dispose de 9 méthodes disponibles pour les tests qui le sont.
// 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 n'a actuellement qu'un seul événement que when
. Il renvoie une promesse avec un résultat booléen du test effectué.
// Type: when(test: boolean): Promise<boolean>
// Acceptable: ['boolean']
Grule est dans une version initiale sans encore beaucoup de fonctionnalités, mais vous pouvez n'hésitez pas à envoyer votre suggestion ou à ouvrir un PR.