You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

48 lines
1.4 KiB
JavaScript

"use strict";
const { validateArguments } = require("@validatem/core");
const either = require("@validatem/either");
const required = require("@validatem/required");
const anyProperty = require("@validatem/any-property");
const isString = require("@validatem/is-string");
const unreachable = require("../unreachable");
const node = require("../ast-node");
const tagAsType = require("../validators/tag-as-type");
module.exports = function (operations) {
const isComputable = require("../validators/operations/is-computable")(operations);
return function compute(_items) {
let [ items ] = validateArguments(arguments, {
// FIXME: Add support for scalar compute
// items: [ required, either([
// [ isComputable, tagAsType("single") ],
// [ anyProperty({
// key: [ required, isString ],
// value: [ required, isComputable ]
// }), tagAsType("multiple") ]
// ]) ]
items: [ required, anyProperty({
key: [ required, isString ],
value: [ required, isComputable ]
}), tagAsType("multiple") ]
});
if (items.type === "multiple") {
return node({
type: "computeMultiple",
items: Object.entries(items.value).map(([ key, value ]) => {
return node({
type: "compute",
column: operations.column(key),
expression: value
});
})
});
} else {
unreachable(`Invalid tagged type '${items.type}'`);
}
};
};