@constructorfleet/ultimate-govee
Version:
Library for interacting with Govee devices written in Typescript.
63 lines • 2.65 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.propertyMatches = void 0;
const decoder_constants_1 = require("./decoder.constants");
const types_1 = require("./types");
const decoder_1 = require("./decoder");
const propertyMatches = (device, conditions, operand) => {
if (conditions.length === 0) {
return true;
}
if (conditions.includes(decoder_constants_1.Or)) {
return conditions
.reduce((acc, cond) => {
if (cond === decoder_constants_1.Or) {
acc.push([]);
}
else {
acc[acc.length - 1].push(cond);
}
return acc;
}, [[]])
.some((conditionGroup) => {
return (0, exports.propertyMatches)(device, conditionGroup);
});
}
// logger.debug({
// device,
// condition: conditions[0],
// condition1: conditions[1],
// operand,
// });
switch (conditions[0]) {
case decoder_constants_1.ManufacturerData:
case decoder_constants_1.ServiceData:
if (typeof conditions[1] === 'number') {
return (0, exports.propertyMatches)(device, conditions.slice(2), Reflect.get(device, conditions[0].replace('data', 'Data')).slice(conditions[1]));
}
if (typeof conditions[1] === 'string' &&
types_1.Comparator.includes(conditions[1].replace('data', 'Data'))) {
return ((0, decoder_1.evaluateComparison)(conditions[1], Reflect.get(device, conditions[0]).length, conditions[2]) && (0, exports.propertyMatches)(device, conditions.slice(3)));
}
return false;
case decoder_constants_1.Inverse:
return !(0, exports.propertyMatches)(device, conditions.slice(1), operand);
case decoder_constants_1.BitShift:
return (((Number.parseInt(operand[0], 16) >> conditions[1]) &
0x01) ===
conditions[2] && (0, exports.propertyMatches)(device, conditions.slice(3), device));
case decoder_constants_1.And:
return false;
default:
if (typeof conditions[0] === 'number' &&
typeof conditions[1] === 'string' &&
typeof operand === 'string') {
return (conditions[1].slice(0, conditions[0]) ===
operand.slice(0, conditions[0]) &&
(0, exports.propertyMatches)(device, conditions.slice(3)));
}
return false;
}
};
exports.propertyMatches = propertyMatches;
//# sourceMappingURL=property.condition.js.map