https://github.com/ayonious/nested-rules-engine
🌲 Decision Tree based Rules Engine
https://github.com/ayonious/nested-rules-engine
decision-tree dfs rule-engine
Last synced: 8 months ago
JSON representation
🌲 Decision Tree based Rules Engine
- Host: GitHub
- URL: https://github.com/ayonious/nested-rules-engine
- Owner: ayonious
- License: mit
- Created: 2018-12-12T22:50:21.000Z (about 7 years ago)
- Default Branch: master
- Last Pushed: 2025-01-08T23:12:39.000Z (about 1 year ago)
- Last Synced: 2025-01-09T00:28:53.427Z (about 1 year ago)
- Topics: decision-tree, dfs, rule-engine
- Language: TypeScript
- Homepage:
- Size: 634 KB
- Stars: 4
- Watchers: 2
- Forks: 1
- Open Issues: 4
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- License: LICENSE
Awesome Lists containing this project
README
nested-rules-engine
🌲Decision Tree based Rules Engine
## Synopsis
A simple Decision tree based Rule Engine described using json files. Rules are executed according to decision tree. Create a set of rules (make them nested as you like) and based on set of inputs run the rules.
## Features
1. Rules expressed in huaman readable JSON
2. Create new set of inputs or change existing inputs as you traverse rules tree
3. Do multiple executions or rules set
## Installation
```
npm install nested-rules-engine --save
```
## Basic Example
```
const {executeEngine} = require('nested-rules-engine');
// Step1: Define your conditional rules
const rules = {
"you_are_a_human": {
"you_are_kind": "help_me_find_my_book",
"you_are_smart": "please_do_my_homework",
},
"default": "please_do_my_homework"
};
// Step2: make set of inputs collection
const inputs = {
"type" : "human",
"kindnessLevel": 0,
"intelligence": 10
}
// Step3: Make your custom Functions
const functions = {
default : () => true,
you_are_a_human: ({type}) => type === 'human',
you_are_kind: ({kindnessLevel}) => kindnessLevel > 300,
you_are_smart: ({intelligence}) => intelligence > 5,
help_me_find_my_book: () => ({
payload: 'lets help someone',
effort: 'finding the book'
}),
please_do_my_homework: () => ({
payload: 'doing homework',
effort: 'im getting sick'
})
};
// Step4: Execute Engine
const res = executeEngine(inputs, functions, rules);
// Output res:
/*
{
result: { payload: 'doing homework', effort: 'im getting sick' },
logs: []
}
*/
```
## Documentation
Engine Execution Signature:
```
executeEngine(variables, functions, rules, options);
```
### Inputs
- `variables` Collection of values on which rule engine will execute
You can change these collection of variables (Add/Edit/Delte them) as you traverse the decision tree of rules.
- `functions` Collection of functions that decide which way the tree should be traversed.
- In case the function indicates a final decision in tree (leaf of decision tree): Output can be anything that you want to see as `result`
- In case the function is makes an intermediate decision (branch of decision tree):
- if output is `true`: this means this branch should be traversed
- else: the function will be executed
- `rules` Decision Tree that will be traversed by this Rule Engine
- `options` there are different options that you can provide to customize the execution nature
- verbose (boolean): Makes Sure you get enough logs while engine goes through all decision tree
- multiple (boolean): You can run multiple Decision Trees based on same inputs. Input sets are shared between each tree
### Outputs
- `result`: Result of the engine execution. format of Result will be defined by you through `functions`
- `logs`: Detailed logs while engine got executed (by default its disabled)
## Hard Examples
1. Example with verbose output, multiple executions [Find Here](https://github.com/ayonious/nested-rules-engine/blob/master/test/multirun-verbose-example.js)
2. Example with Creating new set of inputs while engine is executing [Find Here](https://github.com/ayonious/nested-rules-engine/blob/master/test/change-variables-example.js)
## License
[MIT](https://github.com/ayonious/nested-rules-engine/blob/master/LICENSE)