diff options
Diffstat (limited to 'dgbuilder/core_nodes/logic/10-switch.js')
-rw-r--r-- | dgbuilder/core_nodes/logic/10-switch.js | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/dgbuilder/core_nodes/logic/10-switch.js b/dgbuilder/core_nodes/logic/10-switch.js new file mode 100644 index 00000000..8bcb8571 --- /dev/null +++ b/dgbuilder/core_nodes/logic/10-switch.js @@ -0,0 +1,78 @@ +/** + * Copyright 2013 IBM Corp. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ + +module.exports = function(RED) { + "use strict"; + var operators = { + 'eq': function(a, b) { return a == b; }, + 'neq': function(a, b) { return a != b; }, + 'lt': function(a, b) { return a < b; }, + 'lte': function(a, b) { return a <= b; }, + 'gt': function(a, b) { return a > b; }, + 'gte': function(a, b) { return a >= b; }, + 'btwn': function(a, b, c) { return a >= b && a <= c; }, + 'cont': function(a, b) { return (a + "").indexOf(b) != -1; }, + 'regex': function(a, b) { return (a + "").match(new RegExp(b)); }, + 'true': function(a) { return a === true; }, + 'false': function(a) { return a === false; }, + 'null': function(a) { return typeof a == "undefined"; }, + 'nnull': function(a) { return typeof a != "undefined"; }, + 'else': function(a) { return a === true; } + }; + + function SwitchNode(n) { + RED.nodes.createNode(this, n); + this.rules = n.rules; + this.property = n.property; + this.checkall = n.checkall || "true"; + var propertyParts = n.property.split("."); + var node = this; + + for (var i=0; i<this.rules.length; i+=1) { + var rule = this.rules[i]; + if (!isNaN(Number(rule.v))) { + rule.v = Number(rule.v); + rule.v2 = Number(rule.v2); + } + } + + this.on('input', function (msg) { + var onward = []; + try { + var prop = propertyParts.reduce(function (obj, i) { + return obj[i] + }, msg); + var elseflag = true; + for (var i=0; i<node.rules.length; i+=1) { + var rule = node.rules[i]; + var test = prop; + if (rule.t == "else") { test = elseflag; elseflag = true; } + if (operators[rule.t](test,rule.v, rule.v2)) { + onward.push(msg); + elseflag = false; + if (node.checkall == "false") { break; } + } else { + onward.push(null); + } + } + this.send(onward); + } catch(err) { + node.warn(err); + } + }); + } + RED.nodes.registerType("switch", SwitchNode); +} |