1.1.1Updated a month ago
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)
})