Caporal.js icon indicating copy to clipboard operation
Caporal.js copied to clipboard

Always add the `command` in a validation error's "meta" section.

Open electrotype opened this issue 4 years ago • 1 comments

I'd like to be able to automatically display the full help of a command when a validation fails.

Let's say a command has a --port option with an associated validator: caporal.NUMBER validator. I call this command using --port notNumber: I would like to be able to catch the generated error (in my catch block) and manually call await caporal.exec(['help', COMMAND_NAME]); in order to display the full help of the command! But the executed command is currently not provided in the meta section, on such error.

Also, it would be appreciated if all errors had a dedicated code. For example: code: INVALID_OPTION_VALUE, so we can know without a doubt what the error is and be able to react to it as we want. Yes, Caporal errors currently have a name, but this value is the name of the error's constructor (if I'm not mistaken), and this name is actually minified in your distributed code... So not very solid, in my opinion.

electrotype avatar Jan 15 '21 18:01 electrotype

In case it helps someone one day, I found an ugly workaround to get the executed command, so I can display its help in case of a validation error:

let mainCommand;
const runOriginal = caporal['_run'].bind(caporal);
caporal['_run'] = async function(result, cmd) {
  mainCommand = cmd;
  return await runOriginal(result, cmd);
};

try {
  await caporal.run();
} catch (err) {
  /* use "mainCommand" if defined */ 
}

electrotype avatar Jan 29 '21 01:01 electrotype