eseries
Version:
E-series preferred values library (E12, E24, etc.) for electronic components
267 lines (266 loc) • 10.3 kB
JavaScript
/**
* Command-line interface for the eseries package
*/
import { seriesKeyFromName, series, findNearest, findNearestFew, findGreaterThanOrEqual, findGreaterThan, findLessThan, findLessThanOrEqual, tolerance, erange, lowerToleranceLimit, upperToleranceLimit, toleranceLimits } from './eseries';
import { engString } from './eng';
import { Command } from 'commander';
import { version } from './version';
// Helper functions
function extractSeriesKey(seriesName) {
return seriesKeyFromName(seriesName.toUpperCase());
}
function extractValue(valueStr) {
const value = parseFloat(valueStr);
if (isNaN(value)) {
throw new Error(`'${valueStr}' could not be interpreted as a number`);
}
return value;
}
function presentValue(value, useSymbol) {
return engString(value, 3, useSymbol);
}
export function createCli() {
// Create a new Commander instance
const newProgram = new Command();
newProgram
.name('eseries')
.description('E-series preferred values utility')
.version(version);
newProgram
.command('nearest')
.description('The nearest value in an E-Series')
.argument('<e-series>', 'E-series name (E12, E24, etc.)')
.argument('<value>', 'The target value')
.option('-s, --symbol', 'Use the SI magnitude prefix symbol')
.action((seriesName, valueStr, options) => {
try {
const seriesKey = extractSeriesKey(seriesName);
const value = extractValue(valueStr);
const nearest = findNearest(seriesKey, value);
console.log(presentValue(nearest, options.symbol || false));
}
catch (error) {
console.error(error.message);
process.exit(1);
}
});
newProgram
.command('nearby')
.description('At least three nearby values in an E-Series')
.argument('<e-series>', 'E-series name (E12, E24, etc.)')
.argument('<value>', 'The target value')
.option('-s, --symbol', 'Use the SI magnitude prefix symbol')
.action((seriesName, valueStr, options) => {
try {
const seriesKey = extractSeriesKey(seriesName);
const value = extractValue(valueStr);
const nearby = findNearestFew(seriesKey, value);
nearby.forEach(item => {
console.log(presentValue(item, options.symbol || false));
});
}
catch (error) {
console.error(error.message);
process.exit(1);
}
});
newProgram
.command('gt')
.description('The smallest value greater than the given value')
.argument('<e-series>', 'E-series name (E12, E24, etc.)')
.argument('<value>', 'The target value')
.option('-s, --symbol', 'Use the SI magnitude prefix symbol')
.action((seriesName, valueStr, options) => {
try {
const seriesKey = extractSeriesKey(seriesName);
const value = extractValue(valueStr);
const result = findGreaterThan(seriesKey, value);
console.log(presentValue(result, options.symbol || false));
}
catch (error) {
console.error(error.message);
process.exit(1);
}
});
newProgram
.command('ge')
.description('The smallest value greater than or equal to the given value')
.argument('<e-series>', 'E-series name (E12, E24, etc.)')
.argument('<value>', 'The target value')
.option('-s, --symbol', 'Use the SI magnitude prefix symbol')
.action((seriesName, valueStr, options) => {
try {
const seriesKey = extractSeriesKey(seriesName);
const value = extractValue(valueStr);
const result = findGreaterThanOrEqual(seriesKey, value);
console.log(presentValue(result, options.symbol || false));
}
catch (error) {
console.error(error.message);
process.exit(1);
}
});
newProgram
.command('lt')
.description('The largest value less than the given value')
.argument('<e-series>', 'E-series name (E12, E24, etc.)')
.argument('<value>', 'The target value')
.option('-s, --symbol', 'Use the SI magnitude prefix symbol')
.action((seriesName, valueStr, options) => {
try {
const seriesKey = extractSeriesKey(seriesName);
const value = extractValue(valueStr);
const result = findLessThan(seriesKey, value);
console.log(presentValue(result, options.symbol || false));
}
catch (error) {
console.error(error.message);
process.exit(1);
}
});
newProgram
.command('le')
.description('The largest value less than or equal to the given value')
.argument('<e-series>', 'E-series name (E12, E24, etc.)')
.argument('<value>', 'The target value')
.option('-s, --symbol', 'Use the SI magnitude prefix symbol')
.action((seriesName, valueStr, options) => {
try {
const seriesKey = extractSeriesKey(seriesName);
const value = extractValue(valueStr);
const result = findLessThanOrEqual(seriesKey, value);
console.log(presentValue(result, options.symbol || false));
}
catch (error) {
console.error(error.message);
process.exit(1);
}
});
newProgram
.command('tolerance')
.description('The tolerance of the given E-Series')
.argument('<e-series>', 'E-series name (E12, E24, etc.)')
.option('-s, --symbol', 'Display as a percentage')
.action((seriesName, options) => {
try {
const seriesKey = extractSeriesKey(seriesName);
const tol = tolerance(seriesKey);
if (options.symbol) {
const percent = tol * 100;
console.log(`${Number.isInteger(percent) ? percent : percent}%`);
}
else {
console.log(tol);
}
}
catch (error) {
console.error(error.message);
process.exit(1);
}
});
newProgram
.command('series')
.description('The base values for the given E-Series')
.argument('<e-series>', 'E-series name (E12, E24, etc.)')
.action((seriesName) => {
try {
const seriesKey = extractSeriesKey(seriesName);
series(seriesKey).forEach(item => {
console.log(item);
});
}
catch (error) {
console.error(error.message);
process.exit(1);
}
});
newProgram
.command('range')
.description('All values in the given E-series from start-value to stop-value inclusive')
.argument('<e-series>', 'E-series name (E12, E24, etc.)')
.argument('<start-value>', 'The start value')
.argument('<stop-value>', 'The stop value')
.option('-s, --symbol', 'Use the SI magnitude prefix symbol')
.action((seriesName, startValueStr, stopValueStr, options) => {
try {
const seriesKey = extractSeriesKey(seriesName);
const startValue = extractValue(startValueStr);
const stopValue = extractValue(stopValueStr);
const items = erange(seriesKey, startValue, stopValue);
items.forEach(item => {
console.log(presentValue(item, options.symbol || false));
});
}
catch (error) {
console.error(error.message);
process.exit(1);
}
});
newProgram
.command('lower-tolerance-limit')
.description('The lower tolerance limit of a nominal value')
.argument('<e-series>', 'E-series name (E12, E24, etc.)')
.argument('<value>', 'The nominal value')
.option('-s, --symbol', 'Use the SI magnitude prefix symbol')
.action((seriesName, valueStr, options) => {
try {
const seriesKey = extractSeriesKey(seriesName);
const value = extractValue(valueStr);
const lower = lowerToleranceLimit(seriesKey, value);
console.log(presentValue(lower, options.symbol || false));
}
catch (error) {
console.error(error.message);
process.exit(1);
}
});
newProgram
.command('upper-tolerance-limit')
.description('The upper tolerance limit of a nominal value')
.argument('<e-series>', 'E-series name (E12, E24, etc.)')
.argument('<value>', 'The nominal value')
.option('-s, --symbol', 'Use the SI magnitude prefix symbol')
.action((seriesName, valueStr, options) => {
try {
const seriesKey = extractSeriesKey(seriesName);
const value = extractValue(valueStr);
const upper = upperToleranceLimit(seriesKey, value);
console.log(presentValue(upper, options.symbol || false));
}
catch (error) {
console.error(error.message);
process.exit(1);
}
});
newProgram
.command('tolerance-limits')
.description('The upper and lower tolerance limits of a nominal value')
.argument('<e-series>', 'E-series name (E12, E24, etc.)')
.argument('<value>', 'The nominal value')
.option('-s, --symbol', 'Use the SI magnitude prefix symbol')
.action((seriesName, valueStr, options) => {
try {
const seriesKey = extractSeriesKey(seriesName);
const value = extractValue(valueStr);
const [lower, upper] = toleranceLimits(seriesKey, value);
console.log(presentValue(lower, options.symbol || false));
console.log(presentValue(upper, options.symbol || false));
}
catch (error) {
console.error(error.message);
process.exit(1);
}
});
return newProgram;
}
export function main(args) {
const cli = createCli();
try {
cli.parse(args || process.argv);
return 0;
}
catch (error) {
console.error(error.message);
return 1;
}
}