import yargs from 'yargs';
import { hideBin } from 'yargs/helpers';
import { project } from '@theoryofnekomata/orbis-core';
import { writeFile } from 'fs/promises';
import { basename, dirname, resolve } from 'path';
type ProjectArgs = { input: string, projection: string, output?: string };
const main = async (argv: string | readonly string[]) => {
await yargs
.option('interactive', {
alias: 'i',
})
.command({
command: 'project ',
aliases: 'p',
describe: 'Project an equirectangular PNG image to another projection.',
builder: (y) => y
.option('output', {
alias: 'o',
})
.option('width', {
alias: 'w',
})
.coerce('output', (output) => {
if (!output) {
return null;
}
if (typeof output !== 'string') {
return null;
}
return output;
})
.option('bounds', {
alias: 'b',
default: '-180,90;180,-90',
}),
handler: async (projectArgvRaw) => {
const projectArgv = projectArgvRaw as unknown as ProjectArgs;
const outputPng = await project(projectArgv.input, [projectArgv.projection]);
const outputFilename = projectArgv.output ?? `${basename(projectArgv.input, '.png')}.out.png`;
const outputPath = resolve(
dirname(projectArgv.input),
outputFilename.endsWith('.png') ? outputFilename : `${outputFilename}.png`
);
await writeFile(outputPath, outputPng);
process.stdout.write(`Created output file: ${outputPath}\n`);
},
})
.demandCommand(1, 'Please specify a command')
.help()
.parse(
hideBin((Array.isArray(argv) ? argv : [argv]) as string[]),
);
};
void main(process.argv);