Started implementing constant property

This commit is contained in:
Stefan Zermatten
2021-02-02 16:36:23 +02:00
parent aaa5d0b63b
commit 60ea545ee9
2 changed files with 52 additions and 0 deletions

View File

@@ -0,0 +1,35 @@
import SimpleSchema from 'simpl-schema';
import VARIABLE_NAME_REGEX from '/imports/constants/VARIABLE_NAME_REGEX.js';
/*
* Constants are primitive values that can be used elsewhere in computations
*/
let ConstantSchema = new SimpleSchema({
name: {
type: String,
optional: true,
},
// The technical, lowercase, single-word name used in formulae
variableName: {
type: String,
regEx: VARIABLE_NAME_REGEX,
min: 2,
defaultValue: 'newConstant',
},
// The input value to be parsed, must return a constant node or an array
// of constant nodes to be valid
calculation: {
type: String,
optional: true,
},
// The value, or array of values
result: {
type: SimpleSchema.oneOf(String, Number, Boolean, Array),
maxSize: 32,
},
'result.$': {
type: SimpleSchema.oneOf(String, Number, Boolean),
}
});
export { ConstantSchema };

View File

@@ -1,10 +1,27 @@
import ParseNode from '/imports/parser/parseTree/ParseNode.js';
import ConstantNode from '/imports/parser/parseTree/ConstantNode.js';
export default class ArrayNode extends ParseNode {
constructor({values}) {
super(...arguments);
this.values = values;
}
static fromConstantArray(array){
let values = array.map( value => {
let type = typeof value;
if (
type === 'string' ||
type === 'number' ||
type === 'boolean' ||
type === 'undefined'
){
return new ConstantNode({value, type});
} else {
throw `Unexpected type in constant array: ${type}`
}
});
return new ArrayNode({values});
}
resolve(fn, scope, context){
let values = this.values.map(node => node[fn](scope, context));
return new ArrayNode({values});