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 つの引数を提供します。1 つ目はattributes
、2 つ目はevents
。
各テストに論理式を使用して必要なアクションを実行することも、 when
およびthen
イベントを使用してテストし、結果に基づいてアクションを実行することもできます。これは動的テストに適したオプションです。
インスタンスを作成してルールを登録した後は、パラメータとして定義されたルールを渡すだけで run メソッドを実行できます。テストの終了時に、テストのフローを中断するエラーがなければ、ブール値が返されます。
true
すべての条件が合格しました。false
条件の 1 つまたはすべてが失敗しました。 // ... 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
以外のイベントが 1 つだけあります。実行されたテストのブール結果を含む Promise を返します。
// Type: when(test: boolean): Promise<boolean>
// Acceptable: ['boolean']
Grule はまだ多くの機能が備わっていない初期バージョンですが、お気軽に提案を送信したり、PR をオープンしたりできます。