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
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}'`);
|
|
}
|
|
};
|
|
};
|