package com.feisystems.tools.github.issue;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.GnuParser;
import org.apache.commons.cli.HelpFormatter;
import org.apache.commons.cli.Option;
import org.apache.commons.cli.OptionBuilder;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;
import org.apache.commons.lang.StringUtils;
public class CLI {
public static final String TOOL_NAME = "GitHub Issue Exporter";
public static final String ARG_HELP = "h";
public static final String ARG_HELP_LONG = "help";
public static final String ARG_HELP_DESC = "show help.";
public static final String ARG_ACCESS_TOKEN_ARGNAME = "accessToken";
public static final String ARG_ACCESS_TOKEN = "t";
public static final String ARG_ACCESS_TOKEN_LONG = "token";
public static final String ARG_ACCESS_TOKEN_DESC = "enter the OAuth access token generated by GitHub for authentication";
public static final String ARG_USER_ARGNAME = "userName";
public static final String ARG_USER = "u";
public static final String ARG_USER_LONG = "user";
public static final String ARG_USER_DESC = "enter the username that owns the repository";
public static final String ARG_REPO_ARGNAME = "repositoryName";
public static final String ARG_REPO = "r";
public static final String ARG_REPO_LONG = "repo";
public static final String ARG_REPO_DESC = "enter the repository name";
public static final String ARG_WRITE_FILE_PATH_ARGNAME = "absolueWriteFolderPath";
public static final String ARG_WRITE_FILE_PATH = "p";
public static final String ARG_WRITE_FILE_PATH_LONG = "path";
public static final String ARG_WRITE_FILE_PATH_DESC = "enter the absolute folder path for the output file \"GitHubIssueExport-YYYY-MM-DD-HH-MM.xlsx\" will be created (e.g. C:\\git-issues\\)";
@SuppressWarnings("static-access")
public static Config getConfig(String[] args) {
Config config = new Config();
CommandLineParser parser = new GnuParser();
Options options = new Options();
options.addOption(ARG_HELP, ARG_HELP_LONG, false, ARG_HELP_DESC);
Option accessTokenOption = OptionBuilder
.withArgName(ARG_ACCESS_TOKEN_ARGNAME).hasArg()
.withDescription(ARG_ACCESS_TOKEN_DESC)
.withLongOpt(ARG_ACCESS_TOKEN_LONG).create(ARG_ACCESS_TOKEN);
options.addOption(accessTokenOption);
Option userOption = OptionBuilder.withArgName(ARG_USER_ARGNAME)
.hasArg().withDescription(ARG_USER_DESC)
.withLongOpt(ARG_USER_LONG).create(ARG_USER);
options.addOption(userOption);
Option repoOption = OptionBuilder.withArgName(ARG_REPO_ARGNAME)
.hasArg().withDescription(ARG_REPO_DESC)
.withLongOpt(ARG_REPO_LONG).create(ARG_REPO);
options.addOption(repoOption);
Option writeFilePathOption = OptionBuilder
.withArgName(ARG_WRITE_FILE_PATH_ARGNAME).hasArg()
.withDescription(ARG_WRITE_FILE_PATH_DESC)
.withLongOpt(ARG_WRITE_FILE_PATH_LONG)
.create(ARG_WRITE_FILE_PATH);
options.addOption(writeFilePathOption);
CommandLine cmd = null;
try {
cmd = parser.parse(options, args);
} catch (ParseException e) {
help(options);
throw new RuntimeException(e);
}
String accessToken = cmd.getOptionValue(ARG_ACCESS_TOKEN_LONG);
String user = cmd.getOptionValue(ARG_USER_LONG);
String repo = cmd.getOptionValue(ARG_REPO_LONG);
String writeFilePath = cmd.getOptionValue(ARG_WRITE_FILE_PATH_LONG);
if (StringUtils.isBlank(accessToken) || StringUtils.isBlank(user)
|| StringUtils.isBlank(repo)
|| StringUtils.isBlank(writeFilePath)) {
help(options);
throw new RuntimeException("Missing arguments!");
}
if (cmd.hasOption(ARG_HELP_LONG)) {
help(options);
}
config.setAccessToken(accessToken);
config.setUser(user);
config.setRepo(repo);
config.setWriteFilePath(writeFilePath);
return config;
}
private static void help(Options options) {
HelpFormatter formater = new HelpFormatter();
formater.printHelp(TOOL_NAME, options);
}
}