Started implementing constant property
This commit is contained in:
35
app/imports/api/properties/Constants.js
Normal file
35
app/imports/api/properties/Constants.js
Normal 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 };
|
||||
@@ -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});
|
||||
|
||||
Reference in New Issue
Block a user