Conditional logic macro function
--------------------------------


Conditional logic in macros is supported by the ``fn.conditional_logic`` function that takes 
two parameters:

* the name of an instance of the ``data/ConditionalLogic`` data model
* a value that serves as input to ``data/ConditionalLogic`` the data model.


The namespaces that can be used as ``left_expression`` values in the data model can depend on
the reference to the data model in a Provisioning Workflow. The namespaces - that can also 
be referenced in full - include:

* ``{{self}}``
* ``{{previous}}``
* ``{{input}}``
* ``{{cft}}``
* ``{{pwf}}``

Consider the following example ``data/ConditionalLogic`` data model 
called "Is_SLC_Allowed":


::

   "conditions": [
       {
           "unary_operator": "NOT",
           "right_expression": "{{ logic.DATA }}",
           "conditional_operator": "AND",
           "condition": "contains",
           "left_expression": "{{ pwf.SLCS }}"
       },
       {
           "unary_operator": "NOT",
           "right_expression": "{{ input.CURRENT_SLC }}",
           "conditional_operator": "AND",
           "condition": "containsStartOf",
           "left_expression": "{{ logic.DATA }}"
       },
       {
           "right_expression": "{{ input.CURRENT_SLC }}",
           "condition": "containsStartsWith",
           "unary_operator": "NOT",
           "left_expression": "{{ logic.DATA }}"
       }
   ]


Also suppose the Provisioning Workflow for this example has a list variable ``SLCS``
and receives an ``input.CURRENT_SLC`` value. 

Furthermore, during the call of the ``fn.conditional_logic`` function in the
Provisioning Workflow, it receives a *scalar* value as an argument, for example:

``{{ fn.conditional_logic Is_SLC_Allowed,128 }``

* The scalar value reference ``{{ logic.DATA }}`` can be ommitted
  from either ``left_expression`` or ``right_expression``. Its reference is then assumed.
* The input value is referenced as ``{{ input.CURRENT_SLC }}``
* The list that is the Provisioning Workflow variable, is ``{{ pwf.SLCS }}``   

As another example, consider a ``data/ConditionalLogic`` model called "TestData"
with three conditions:

::
  
   "conditions": [
                  {
                      "conditional_operator": "OR",
                      "left_expression": "{{input.DATA}}",
                      "condition": "contains",
                      "right_expression": "AAA"
                  },
                  {
                      "conditional_operator": "AND",
                      "left_expression": "{{input.DATA}}",
                      "condition": "contains",
                      "right_expression": "BBB"
                  },
                  {
                      "left_expression": "{{input.DATA}}",
                      "condition": "contains",
                      "right_expression": "CCC",
                      "unary_operator": "NOT"
                  }


The following function checks if a received input value "AAAaaaBBBaaaCCc"
fulfills the condition: contains "AAA" OR "BBB" AND NOT "CCC", as in the macro test
using a scalar value:

``{{ fn.conditional_logic TestData,AAaaaBBBaaaCCc }}``

The condition resolves to true.

Finally in the following example, the conditional function is used as a condition in a Provisioning Workflow.
The Data Model instance of data/ConditionalLogic called "Does Newland Exist" tests a single string matching
condition:

::
  
   "data": {
       "conditions": [
           {
               "right_expression": "Newland",
               "condition": "isexactly",
               "left_expression": "{{pwf.EXIST}}"
           }
       ],
       "name": "Does Newland Exist"
   }

The Provisioning Workflow step to apply a Configuration Template if the condition is false.
So the step is carried out only if there is not already a ``country_name`` called "Newland".

::

   "workflow": [
     {
       "templates": [
         {
           "conditions": [
             {
               "condition": "(( fn.conditional_logic \"Does Newland Exist\" == False ))"
             }
           ],
           "template": "CFT1"
         }
       ],
       "entity": "data/Countries",
       "set_list": [
         {
           "set_var_name": "EXIST",
           "set_var_value": "{{data.Countries.country_name|country_name:Newland}}"
         }
       ],
       "method": "add",
       "entity_type": "model"
     }

