Wednesday, 14 February 2018

How i'm using JCommander

recently i started using CLI parsers  for my programs. after using some of them, i liked JCommander and this is how i'm using it in my one of programs.




package samrock.app.main;
import static sam.console.ansi.ANSI.yellow;

import java.io.IOException;
import java.util.Comparator;
import java.util.Formatter;
import java.util.List;

import com.beust.jcommander.JCommander;
import com.beust.jcommander.Parameter;

public class App {
    static final double VERSION = 2.00;

    @Parameter(names= {"-h", "--help"},description = "print this", help=true, order=0)
    public boolean help;

    @Parameter(names= {"-v", "--version"},description = "print version", order=1)
    public boolean version;

    @Parameter(names= {"-c", "--convert"}, description =  "samrock converter", order=2)
    public boolean convert;

    @Parameter(names= {"-s", "--split"}, description =  "Double page splitter", order=3)
    public boolean split;

    @Parameter(names= {"-u","--utils" },description = "Utils", order=4)
    public boolean utils;

    @Parameter
    List<String> argsList;

    //TODO move to samrock tools
    /*
     * @Parameter(names= {"-cmi", "--changeMangaId"},description = "this will make required changes, in databases and files required transition in old manga_id to new manga_id")
    public boolean changeMangaId;
     */



    //TODO move to samrock tools
    // -add      --add-new-manga                      add new manga manually

    public static void main(String[] args) throws IOException {
        if(args.length == 1 && (args[0].equals("-v") || args[0].equals("--version"))) {
            System.out.println(VERSION);
            System.exit(0);
        }
        try {
            new App(args);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public App(String[] args) {
        JCommander jc = JCommander.newBuilder()
                .programName("conv")
                .addObject(this).build();
        jc.parse(args);

        if(!(convert || split || utils)) {
            System.out.println(yellow("no options specified"));
            printUsage(jc);
            return;
        }
        SkipOption.init();

        if(convert) {
            Convert c = new Convert();
            jc = check(c, "conv --convert [file]");
        }
        if(split) {
            Split c = new Split();
            jc = check(c, "conv --split [file]");
        }
        if(utils) {
            Utils2 c = new Utils2();
            jc = check(c, "conv --utils ");
        }
    }
    private JCommander check(Object obj, String programName) {
        JCommander jc = JCommander.newBuilder()
                .programName(programName)
                .addObject(obj).build();

        if(help || argsList == null || argsList.isEmpty()) {
            jc.parse("-h");
            printUsage(jc);
        } else {
            jc.parse(argsList.toArray(new String[argsList.size()]));
        }
        return jc;
    }
    private void printUsage(JCommander jc) {
        StringBuilder sb = new StringBuilder();
        Formatter fm = new Formatter(sb);

        yellow(sb, "Usage: ");
        yellow(sb, jc.getProgramName());
        yellow(sb, " [options]\n");

        if(jc.getObjects().get(0) instanceof Convert)
            sb.append("  [file] : is a tsv file cotaining chapters data\n");
        if(jc.getObjects().get(0) instanceof Split)
            sb.append("  [file] : is a folder containing images, \n")
              .append("           if --batch is present then it's a folder containing folders of images\n");

        yellow(sb, "  Options:\n");

        String format2 = "    %-"+(jc.getParameters().stream().mapToInt(p -> p.getNames().length()).max().getAsInt()+5)+"s%s\n";
        jc.getParameters()
        .stream()
        .sorted(Comparator.comparing(p -> p.getParameterAnnotation().order()))
        .forEach(p -> {
            String format = p.getParameterAnnotation().order() >= 20 ? "      "+format2 : format2; 
            if(p.getParameterAnnotation().order() == 10)
                yellow(sb, "\n  Convert Options:\n");
            fm.format(format, p.getNames(), p.getDescription());
        });
        if(jc.getObjects().get(0) == this) {
            yellow(sb, "\nhelp usage:\n")
            .append("  conv --help [option]").append('\n');
            sb.append("   e.g.  ").append('\n');
            sb.append("      conv --help -c").append('\n');
        }

        fm.close();
        System.out.println(sb.toString());
    }
}

download code

styled using hilite.me