JsonLogic implemented with a Rust backend
Project description
json-logic-rs
This is an implementation of the JsonLogic specification in Rust.
Project Status
We implement 100% of the standard supported operations defined here.
We also implement the ?:
, which is not described in that specification
but is a direct alias for if
.
All operations are tested using our own test suite in Rust as well as the shared tests for all JsonLogic implementations defined here.
We are working on adding new operations with improved type safety, as well as the ability to define functions as JsonLogic. We will communicate with the broader JsonLogic community to see if we can make them part of the standard as we do so.
Being built in Rust, we are able to provide the package in a variety of languages. The table below describes current language support:
Language | Available Via |
---|---|
Rust | Cargo |
JavaScript (as WASM) | Node Package via NPM |
Python | PyPI |
Installation
Rust
Just add to your Cargo.toml
:
[dependencies]
jsonlogic-rs = "~0.1.1"
Node/Browser
You can install JsonLogic using npm or yarn. In NPM:
npm install --save @bestow/jsonlogic-rs
Note that the package is distributed as a node package, so you'll need to use
browserify
, webpack
, or similar to install for the browser.
Python
Wheels are distributed for many platforms, so you should often be able to just run:
pip install jsonlogic-rs
If a wheel does not exist for your system, this will attempt to build the
package. In order for the package to build successfully, you MUST have Rust
installed on your local system, and cargo
MUST be present in your PATH
.
See Building below for more details.
Usage
Rust
use jsonlogic_rs;
use serde_json::json;
// You can pass JSON values deserialized with serde straight
// into apply().
fn main() {
assert_eq!(
jsonlogic_rs::apply(
json!({"===": [{"var": "a"}, 7]}),
json!({"a": 7}),
),
json!(true)
);
}
Javascript
const jsonlogic = require("jsonlogic-rs")
jsonlogic.apply(
{"===": [{"var": "a"}, 7]},
{"a": 7}
)
Python
import jsonlogic_rs
res = jsonlogic_rs.apply(
{"===": [{"var": "a"}, 7]},
{"a": 7}
)
assert res == True
# If You have serialized JsonLogic and data, the `apply_serialized` method can
# be used instead
res = jsonlogic_rs.apply_serialized(
'{"===": [{"var": "a"}, 7]}',
'{"a": 7}'
)
Building
Prerequisites
You must have Rust installed and cargo
available in your PATH
.
If you would like to build or test the Python distribution, Python 3.6 or
newer must be available in your PATH
. The venv
module must be part of the
Python distribution (looking at you, Ubuntu).
If you would like to run tests for the WASM package, node
10 or newer must be
available in your PATH
.
Rust
To build the Rust library, just run cargo build
.
You can create a release build with make build
.
WebAssembly
You can build a debug WASM release with
make debug-wasm
You can build a production WASM release with
make build-wasm
The built WASM package will be in js/
. This package is directly importable
from node
, but needs to be browserified in order to be used in the browser.
Python
To perform a dev install of the Python package, run:
make develop-py
This will automatically create a virtual environment in venv/
, install
the necessary packages, and then install jsonlogic_rs
into that environment.
Note: from our CI experiences, this may not work for Python 3.8 on Windows. If you are running this on a Windows machine and can confirm whether or not this works, let us know!
To build a production source distribution:
make build-py-sdist
To build a wheel (specific to your current system architecture and python version):
make build-py-wheel
The python distribution consists both of the C extension generated from the
Rust and a thin wrapper found in py/jsonlogic_rs/
. make develop-py
will
compile the C extension and place it in that directory, where it will be
importable by your local venv. When building wheels, the wrapper and the C
extension are all packaged together into the resultant wheel, which will
be found in dist/
. When building an sdist, the Rust extension is not compiled.
The Rust and Python source are distributed together in a .tar.gz
file, again
found in dist/
.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
File details
Details for the file jsonlogic-rs-0.1.2.tar.gz
.
File metadata
- Download URL: jsonlogic-rs-0.1.2.tar.gz
- Upload date:
- Size: 32.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/41.2.0 requests-toolbelt/0.9.1 tqdm/4.47.0 CPython/3.8.3
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | d0224af6dc5627c76a6d397c41cc9880b2aee93397d0296afb619ac9b3532ab8 |
|
MD5 | 4d53a901685132b0d44846649690734d |
|
BLAKE2b-256 | 7ebcd97d4d5464859a142b7e6964821e9ec58611e332ffbda9c8c3266aedad2c |