DockerERTFF/lib/modules/arraylist.js

173 lines
7.0 KiB
JavaScript

// ArrayList
const { clone } = require('../core/util');
// Create a new ArrayList
exports.create = function(options, name) {
const value = this.parseOptional(options.value, 'object', []);
if (!name) throw Error('arraylist.create: name is required.');
if (!this.req.arrays) {
this.req.arrays = {};
}
this.req.arrays[name] = Array.isArray(value) ? clone(value) : [];
};
// Return the ArrayList as array value
exports.value = function(options) {
const ref = this.parseRequired(options.ref, 'string', 'arraylist.value: ref is required.');
if (!this.req.arrays) throw Error('arraylist.value: No ArrayList are created.');
if (!this.req.arrays[ref]) throw Error(`arraylist.value: ArrayList ${ref} not found.`);
return clone(this.req.arrays[ref]);
};
// Return the size of the ArrayList
exports.size = function(options) {
const ref = this.parseRequired(options.ref, 'string', 'arraylist.size: ref is required.');
if (!this.req.arrays) throw Error('arraylist.size: No arraylists are created.');
if (!this.req.arrays[ref]) throw Error(`arraylist.size: ArrayList ${ref} not found.`);
return this.req.arrays[ref].length;
};
// Return the value at a specific index
exports.get = function(options) {
const ref = this.parseRequired(options.ref, 'string', 'arraylist.get: ref is required.');
const index = this.parseRequired(options.index, 'number', 'arraylist.get: index is required.');
if (!this.req.arrays) throw Error('arraylist.get: No ArrayList are created.');
if (!this.req.arrays[ref]) throw Error(`arraylist.get: ArrayList ${ref} not found.`);
return clone(this.req.arrays[ref][index]);
};
// Add a value to the ArrayList
exports.add = function(options) {
const ref = this.parseRequired(options.ref, 'string', 'arraylist.add: ref is required.');
const value = this.parseRequired(options.value, '*', 'arraylist.add: value is required.');
if (!this.req.arrays) throw Error('arraylist.add: No ArrayList are created.');
if (!this.req.arrays[ref]) throw Error(`arraylist.add: ArrayList ${ref} not found.`);
this.req.arrays[ref].push(clone(value));
};
// Add an array of values to the ArrayList
exports.addAll = function(options) {
const ref = this.parseRequired(options.ref, 'string', 'arraylist.addAll: ref is required.');
const value = this.parseRequired(options.value, 'object', 'arraylist.addAll: value is required.');
if (!this.req.arrays) throw Error('arraylist.addAll: No ArrayList are created.');
if (!this.req.arrays[ref]) throw Error(`arraylist.addAll: ArrayList ${ref} not found.`);
if (!Array.isArray(value)) throw Error('arraylist.addAll: Value must be an array.')
for (let val of value) {
this.req.arrays[ref].push(clone(val));
}
};
// Update a value at a specific index
exports.set = function(options) {
const ref = this.parseRequired(options.ref, 'string', 'arraylist.set: ref is required.');
const index = this.parseRequired(options.index, 'number', 'arraylist.set: index is required.');
const value = this.parseRequired(options.value, '*', 'arraylist.set: value is required.');
if (!this.req.arrays) throw Error('arraylist.set: No ArrayList are created.');
if (!this.req.arrays[ref]) throw Error(`arraylist.set: ArrayList ${ref} not found.`);
this.req.arrays[ref][index] = clone(value);
};
// Remove the first occurrence of a specific value
exports.remove = function(options) {
const ref = this.parseRequired(options.ref, 'string', 'arraylist.remove: ref is required.');
const value = this.parseRequired(options.value, '*', 'arraylist.remove: value is required.');
if (!this.req.arrays) throw Error('arraylist.remove: No ArrayList are created.');
if (!this.req.arrays[ref]) throw Error(`arraylist.remove: ArrayList ${ref} not found.`);
const index = this.req.arrays[ref].indexOf(value);
if (index == -1) throw Error('arraylist.remove: Value does not exist in the ArrayList.');
this.req.arrays[ref].splice(index, 1);
};
// Remove a value from the ArrayList at a specific index
exports.removeAt = function(options) {
const ref = this.parseRequired(options.ref, 'string', 'arraylist.removeAt: ref is required.');
const index = this.parseRequired(options.index, 'number', 'arraylist.removeAt: index is required.');
if (!this.req.arrays) throw Error('arraylist.removeAt: No ArrayList are created.');
if (!this.req.arrays[ref]) throw Error(`arraylist.removeAt: ArrayList ${ref} not found.`);
this.req.arrays[ref].splice(index, 1);
};
// Clear all values from the ArrayList
exports.clear = function(options) {
const ref = this.parseRequired(options.ref, 'string', 'arraylist.clear: ref is required.');
if (!this.req.arrays) throw Error('arraylist.clear: No ArrayList are created.');
if (!this.req.arrays[ref]) throw Error(`arraylist.clear: ArrayList ${ref} not found.`);
this.req.arrays[ref] = [];
};
// Sort the ArrayList
exports.sort = function(options) {
const ref = this.parseRequired(options.ref, 'string', 'arraylist.sort: ref is required.');
const prop = this.parseOptional(options.prop, 'string', null);
const desc = this.parseOptional(options.desc, 'boolean', false);
if (!this.req.arrays) throw Error('arraylist.sort: No ArrayList are created.');
if (!this.req.arrays[ref]) throw Error(`arraylist.sort: ArrayList ${ref} not found.`);
this.req.arrays[ref].sort((a, b) => {
if (prop) {
a = a[prop];
b = b[prop];
}
if (a == b) return 0;
if (a < b) return desc ? 1 : -1;
return desc ? -1 : 1;
});
};
// Return the index of the first occurrence of a specific value
exports.indexOf = function(options) {
const ref = this.parseRequired(options.ref, 'string', 'arraylist.indexOf: ref is required.');
const value = this.parseRequired(options.value, '*', 'arraylist.indexOf: value is required.');
if (!this.req.arrays) throw Error('arraylist.indexOf: No ArrayList are created.');
if (!this.req.arrays[ref]) throw Error(`arraylist.indexOf: ArrayList ${ref} not found.`);
return this.req.arrays[ref].indexOf(value);
};
// Return true if the ArrayList contains a specific value
exports.contains = function(options) {
const ref = this.parseRequired(options.ref, 'string', 'arraylist.contains: ref is required.');
const value = this.parseRequired(options.value, '*', 'arraylist.contains: value is required.');
if (!this.req.arrays) throw Error('arraylist.contains: No ArrayList are created.');
if (!this.req.arrays[ref]) throw Error(`arraylist.contains: ArrayList ${ref} not found.`);
return this.req.arrays[ref].includes(value);
};
// Return true when ArrayList is empty
exports.isEmpty = function(options) {
const ref = this.parseRequired(options.ref, 'string', 'arraylist.isEmpty: ref is required.');
if (!this.req.arrays) throw Error('arraylist.isEmpty: No ArrayList are created.');
if (!this.req.arrays[ref]) throw Error(`arraylist.isEmpty: ArrayList ${ref} not found.`);
return !this.req.arrays[ref].length;
};