# Universal Conditions AST
[![@ucast/core NPM version](https://badge.fury.io/js/%40ucast%2Fcore.svg)](https://badge.fury.io/js/%40ucast%2Fcore)
[![](https://img.shields.io/npm/dm/%40ucast%2Fcore.svg)](https://www.npmjs.com/package/%40ucast%2Fcore)
[![UCAST join the chat](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/stalniy-ucast/community)
This package contains classes and functions that helps to create parsers, conditions AST, interpreters and translators.
## Installation
```sh
npm i @ucast/core
# or
yarn add @ucast/core
# or
pnpm add @ucast/core
```
## Getting Started
### Parser
Parser is a function that translates conditions from any language into conditions AST. For example, `MongoQueryParser` parses MongoQuery into AST which then can be interpreted by `JavaScriptInterpreter` that returns a boolean value based on passed in object.
### Conditions AST
Abstract Syntax Tree of any condition. **What is condition?**
`x > 4` is a condition, `x === 4` is a condition as well, `{ x: { $eq: 4 } }` is a [MongoQuery](http://docs.mongodb.org/manual/reference/operator/query/) condition.
There are few types of AST nodes that allow us to represent any condition:
* **FieldCondition**. \
Depends on a field, operator and its value. For example, in condition `x > 4`, `x` is a field, `4` is a value and `>` is operator
* **DocumentCondition**. \
Any condition that test a document (or a row) as whole (e.g., in MongoDB Query, it's `$where` operator and in SQL it's `EXISTS`).
* **CompoundCondition**. \
Combines other conditions using logical operations like "and", "or", "not".
### Interpreter
An interpreter is a function that interprets conditions AST in a specific way. For example, it can:
* interpret conditions in JavaScript runtime to return a boolean result
* or it can convert conditions into SQL `WHERE` statement
* or MongoDB query,
* or HTTP/REST query
* or GraphQL input
* or anything else you can imagine
### Translator
Combines Parser and Interpreter and returns a factory function:
```js
const parse = (query) => /* to conditions AST */
const interpreter = createInterpreter({ /* condition interpreters */ });
const translate = (query, ...args) => interpreter.bind(null, parse(query));
```
## Want to help?
Want to file a bug, contribute some code, or improve documentation? Excellent! Read up on guidelines for [contributing]
## License
[Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
[contributing]: https://github.com/stalniy/ucast/blob/master/CONTRIBUTING.md