ergogen/src/assert.js

89 lines
2.8 KiB
JavaScript
Raw Normal View History

2020-07-10 22:40:34 +02:00
const m = require('makerjs')
2020-06-27 20:13:06 +02:00
const Point = require('./point')
const assert = exports.assert = (exp, msg) => {
if (!exp) {
throw new Error(msg)
}
}
const type = exports.type = (val) => {
if (Array.isArray(val)) return 'array'
if (val === null) return 'null'
return typeof val
}
const sane = exports.sane = (val, name, _type) => {
assert(type(val) == _type, `Field "${name}" should be of type ${_type}!`)
return val
}
const detect_unexpected = exports.detect_unexpected = (obj, name, expected) => {
const sane_obj = sane(obj, name, 'object')
for (const key of Object.keys(sane_obj)) {
assert(expected.includes(key), `Unexpected key "${key}" within field "${name}"!`)
}
}
2020-06-30 22:29:14 +02:00
exports.in = (raw, name, arr) => {
assert(arr.includes(raw), `Field "${name}" should be one of [${arr.join(', ')}]!`)
return raw
}
2020-06-28 22:35:53 +02:00
const numarr = exports.numarr = (raw, name, length) => {
assert(type(raw) == 'array' && raw.length == length, `Field "${name}" should be an array of length ${length}!`)
raw = raw.map(val => val || 0)
raw.map(val => assert(type(val) == 'number', `Field "${name}" should contain numbers!`))
return raw
2020-06-27 20:13:06 +02:00
}
2020-06-28 22:35:53 +02:00
const xy = exports.xy = (raw, name) => numarr(raw, name, 2)
2020-07-04 23:23:14 +02:00
const wh = exports.wh = (raw, name) => {
2020-06-28 22:35:53 +02:00
if (!Array.isArray(raw)) raw = [raw, raw]
2020-07-04 23:23:14 +02:00
return xy(raw, name)
2020-06-28 22:35:53 +02:00
}
exports.trbl = (raw, name) => {
if (!Array.isArray(raw)) raw = [raw, raw, raw, raw]
if (raw.length == 2) raw = [raw[1], raw[0], raw[1], raw[0]]
return numarr(raw, name, 4)
}
2020-07-04 23:23:14 +02:00
exports.anchor = (raw, name, points={}, check_unexpected=true, default_point=new Point()) => {
2020-06-28 22:35:53 +02:00
if (check_unexpected) detect_unexpected(raw, name, ['ref', 'shift', 'rotate'])
2020-07-14 23:03:44 +02:00
let point = default_point.clone()
2020-06-27 20:13:06 +02:00
if (raw.ref !== undefined) {
2020-07-14 23:03:44 +02:00
if (type(raw.ref) == 'array') {
// averaging multiple anchors
let x = 0, y = 0, r = 0
const len = raw.ref.length
for (const ref of raw.ref) {
assert(points[ref], `Unknown point reference "${ref}" in anchor "${name}"!`)
const resolved = points[ref]
x += resolved.x
y += resolved.y
r += resolved.r
}
point = new Point(x / len, y / len, r / len)
} else {
assert(points[raw.ref], `Unknown point reference "${raw.ref}" in anchor "${name}"!`)
point = points[raw.ref].clone()
}
2020-06-27 20:13:06 +02:00
}
if (raw.shift !== undefined) {
2020-07-10 22:40:34 +02:00
let xyval = wh(raw.shift || [0, 0], name + '.shift')
2020-07-14 23:03:44 +02:00
if (point.meta.mirrored) {
xyval[0] = -xyval[0]
}
point.shift(xyval, true)
2020-06-27 20:13:06 +02:00
}
if (raw.rotate !== undefined) {
2020-07-14 23:03:44 +02:00
let rot = sane(raw.rotate || 0, name + '.rotate', 'number')
if (point.meta.mirrored) {
rot = -rot
}
point.r += rot
2020-06-27 20:13:06 +02:00
}
2020-07-14 23:03:44 +02:00
return point
2020-06-27 20:13:06 +02:00
}