Skip to main content

Logic

Build and evaluate conditional rules

Concepts

Rule

A "rule" is an object (associative array) that always has a single property, with the key being an operator; and the value as a list of arguments for the operator, or another rule.

export type Rule = {
[key in Operator]: RuleValue | RuleValue[]
}

Example of logic rules

{
'==': [1, 2]
}

..is equivalent to the condition, 1 == 2.

{
and: [
{ '>': [1, 2] },
{ '<': [3, 4] }
]
}

..is (1 > 2) && (3 < 4).

Operators

Here is a list of currently supported operators.

  • ==
  • ===
  • !=
  • !==
  • >
  • >=
  • <
  • <=
  • !!
  • !
  • %
  • log
  • in
  • cat
  • substr
  • +
  • *
  • -
  • /
  • min
  • max
  • merge
  • var
  • missing
  • missing_some
  • rule
  • and
  • or
  • not
  • all
  • none
  • some
  • filter
  • map
  • reduce
  • if

Use

Typescript

Basic

import * as logic from '@tangible/logic'

logic.evaluate({
'==': [1, 1]
}) // === true

Dynamic rules

const ruleEvaluator = (rule, data) => {
return data[ rule.key ] === data[ rule.value ]
}

const condition = {
rule: { key: 'example', value: '123' }
}

const data = { example: '123' }

const result = logic.evaluate(condition, ruleEvaluator, data)

PHP

Basic

use tangible\logic;

logic\evaluate([
'==': [1, 1]
]); // === true

Dynamic rules

$rule_evaluator = function($rule, $data) {
return $data[ rule['key'] ] === $data[ rule['value'] ];
};

$condition = {
'rule' => [
'key' => 'example',
'value' => '123'
]
}

$data = [ 'example' => '123' ];

$result = logic/evaluate($condition, $rule_evaluator, $data);

Use from WordPress plugin or module

Update composer.json and run composer update.

{
"repositories": [
{
"type": "vcs",
"url": "[email protected]:tangibleinc/logic"
}
],
"require": {
"tangible/logic": "dev-main"
},
"minimum-stability": "dev"
}

Load it from plugin or module.

require_once __DIR__ . '/vendor/tangible/logic/module.php';

It loads the newest version of this module, even when there are multiple instances loaded. Functions under the namespace tangible\logic are ready to use after action plugins_loaded priority 0.

In JavaScript, import from the entry file.

import * as logic from './vendor/tangible/logic/index.ts'