import { parseArgs, type ParseOptions } from "jsr:@std/cli/parse-args";
import meta from '../../deno.json' with { type: 'json' };
import { stringSort } from "../utils/string_sort.ts";
import { CommandCodes, RunCommand } from "./command_runner.ts";
import { OptionCodes, GetOption, Option } from "./options.ts";
import { GetCommand } from "./commands/enum.ts";
import { UpdateNotifier } from "./update_notifier.ts";
await UpdateNotifier();
const printUsage = () => {
console.log("");
console.log("Usage: viapak [OPTIONS] [COMMAND]");
console.log("");
console.log("Options:")
for(const option_code of OptionCodes.filter(c => !c.secret).sort(stringSort({ field: 'option', transformer: GetOption }))) {
const long = GetOption(option_code.option);
const short = option_code.option;
const short_display = short == long ? ''.padEnd(4, ' ',) : `-${short}`.padEnd(4, ' ');
const long_display = `--${long}`.padEnd(14, ' ');
console.log(` ${short_display} ${long_display} ${option_code.description}`);
}
console.log("");
console.log("Commands:")
for(const command_code of CommandCodes.sort(stringSort({ field: 'command', transformer: GetCommand }))) {
console.log(` ${GetCommand(command_code.command)}`.padEnd(18, ' '), command_code.description);
if(command_code.more_info?.length) {
for(const line of command_code.more_info) {
console.log(`${''.padEnd(18, ' ')} ${line}`);
}
}
}
console.log("");
}
const parse_options: ParseOptions = {
boolean: Object.keys(Option),
alias: Object.entries(Option).map(([long, short]) => {
return { long, short }
}).reduce(( current, { long, short } ) => { current[long] = short; return current; }, {} as Record<string, string>),
string: ['version']
}
const args = parseArgs(Deno.args, parse_options);
if(args.help || args._[0] == 'help' || (args._.length === 0 && !args.version)) {
printUsage();
Deno.exit(0);
} else if(args.version) {
const version = meta?.version || "1.0.0";
console.log(`Viapak v${version}`);
Deno.exit(0);
}
RunCommand({
name: args._[0] as string,
options: Object.entries(args).map(([key, value]) => {
return { key, value }
}).filter(kv => kv.value && kv.key !== '_')
.reduce((options_out, { key, value }) => {
if(value === 'true') value = true;
if(value === 'false') value = false;
options_out[key] = value;
return options_out;
}, {} as Record<string, any>),
args: args._.splice(1)
})