ergogen/src/ergogen.js

115 lines
3.5 KiB
JavaScript
Raw Normal View History

const u = require('./utils')
2021-07-15 21:36:44 +02:00
const io = require('./io')
2021-01-01 00:50:04 +01:00
const prepare = require('./prepare')
const units_lib = require('./units')
2021-01-01 00:50:04 +01:00
const points_lib = require('./points')
const outlines_lib = require('./outlines')
const cases_lib = require('./cases')
const pcbs_lib = require('./pcbs')
2021-12-15 20:33:50 +01:00
const version = require('../package.json').version
2021-07-16 13:18:50 +02:00
const process = async (raw, debug=false, logger=()=>{}) => {
2021-07-16 14:31:07 +02:00
const prefix = 'Interpreting format: '
2021-07-16 13:18:50 +02:00
let empty = true
let [config, format] = io.interpret(raw, logger)
2021-07-16 14:31:07 +02:00
let suffix = format
2022-12-03 17:19:51 +01:00
// KLE conversion warrants automaticly engaging debug mode
// as, usually, we're only interested in the points anyway
2021-07-16 14:31:07 +02:00
if (format == 'KLE') {
suffix = `${format} (Auto-debug)`
debug = true
}
logger(prefix + suffix)
2021-07-16 13:18:50 +02:00
logger('Preprocessing input...')
config = prepare.unnest(config)
config = prepare.inherit(config)
2022-01-14 19:28:19 +01:00
config = prepare.parameterize(config)
2021-07-16 13:18:50 +02:00
const results = {}
if (debug) {
results.raw = raw
results.canonical = u.deepcopy(config)
}
2021-12-15 20:33:50 +01:00
if (config.meta && config.meta.engine) {
logger('Checking compatibility...')
const engine = u.semver(config.meta.engine, 'config.meta.engine')
if (!u.satisfies(version, engine)) {
throw new Error(`Current ergogen version (${version}) doesn\'t satisfy config's engine requirement (${config.meta.engine})!`)
2021-12-15 20:33:50 +01:00
}
}
2021-07-16 13:18:50 +02:00
logger('Calculating variables...')
const units = units_lib.parse(config)
if (debug) {
results.units = units
}
logger('Parsing points...')
if (!config.points) {
2021-07-18 00:39:33 +02:00
throw new Error('Input does not contain a points clause!')
2021-07-16 13:18:50 +02:00
}
const points = points_lib.parse(config.points, units)
2021-07-18 00:39:33 +02:00
if (!Object.keys(points).length) {
throw new Error('Input does not contain any points!')
}
2021-07-16 13:18:50 +02:00
if (debug) {
results.points = points
2021-07-18 16:26:30 +02:00
results.demo = io.twodee(points_lib.visualize(points, units), debug)
2021-07-16 13:18:50 +02:00
}
2021-07-16 13:18:50 +02:00
logger('Generating outlines...')
const outlines = outlines_lib.parse(config.outlines || {}, points, units)
results.outlines = {}
for (const [name, outline] of Object.entries(outlines)) {
if (!debug && name.startsWith('_')) continue
results.outlines[name] = io.twodee(outline, debug)
empty = false
}
2021-01-01 00:50:04 +01:00
2022-04-16 13:12:51 +02:00
logger('Modeling cases...')
2021-07-16 13:18:50 +02:00
const cases = cases_lib.parse(config.cases || {}, outlines, units)
results.cases = {}
for (const [case_name, case_script] of Object.entries(cases)) {
if (!debug && case_name.startsWith('_')) continue
2022-04-16 13:12:51 +02:00
results.cases[case_name] = {jscad: case_script}
2021-07-16 13:18:50 +02:00
empty = false
}
2021-01-01 00:50:04 +01:00
2021-07-16 13:18:50 +02:00
logger('Scaffolding PCBs...')
2021-12-15 20:55:09 +01:00
const pcbs = pcbs_lib.parse(config, points, outlines, units)
2021-07-16 13:18:50 +02:00
results.pcbs = {}
for (const [pcb_name, pcb_text] of Object.entries(pcbs)) {
if (!debug && pcb_name.startsWith('_')) continue
results.pcbs[pcb_name] = pcb_text
empty = false
}
2021-01-01 21:46:01 +01:00
2021-07-16 13:18:50 +02:00
if (!debug && empty) {
logger('Output would be empty, rerunning in debug mode...')
return process(raw, true, () => {})
}
return results
}
2021-01-01 00:50:04 +01:00
2022-11-14 00:40:05 +01:00
const inject = (type, name, value) => {
if (value === undefined) {
value = name
name = type
type = 'footprint'
}
switch (type) {
case 'footprint':
return pcbs_lib.inject_footprint(name, value)
default:
throw new Error(`Unknown injection type "${type}" with name "${name}" and value "${value}"!`)
}
}
2021-07-16 13:18:50 +02:00
module.exports = {
2021-12-15 20:33:50 +01:00
version,
2021-07-16 13:18:50 +02:00
process,
2022-11-14 00:40:05 +01:00
inject
2020-06-16 22:24:46 +02:00
}