private static void showHelpAndExit( final Context context, final boolean headers, final List<CompileParameter> parameters) { if (headers) { context.show("DSL Platform - Command-Line Client (" + Main.getVersion() + ")"); context.show( "This tool allows you to compile provided DSL to various languages such as Java, Scala, PHP, C#, etc... or create an SQL migration between two DSL models."); } context.show(); context.show(); context.show("Command parameters:"); int max = 0; for (final CompileParameter cp : parameters) { if (cp.getShortDescription() == null) { continue; } int width = cp.getAlias().length(); if (cp.getUsage() != null) { width += 1 + cp.getUsage().length(); } if (max < width) { max = width; } } max += 2; for (final CompileParameter cp : parameters) { if (cp.getShortDescription() == null) { continue; } final StringBuilder sb = new StringBuilder(); sb.append(" -").append(cp.getAlias()); int len = max - cp.getAlias().length(); if (cp.getUsage() != null) { sb.append("=").append(cp.getUsage()); len -= cp.getUsage().length() + 1; } for (; len >= 0; len--) { sb.append(' '); } sb.append(cp.getShortDescription()); context.show(sb.toString()); } context.show(); context.show("Example usages:"); context.show("\ttarget=java_client,revenj.java postgres=localhost/Database?user=postgres"); context.show( "\tjava_client=model.jar revenj.net=Model.dll postgres=localhost/Database?user=postgres"); context.show("\tproperties=development.props download"); }
private static boolean parse( final String[] args, final Context context, final List<CompileParameter> parameters) { if (args.length == 1 && ("/?".equals(args[0]) || "-?".equals(args[0]) || "?".equals(args[0]))) { showHelpAndExit(context, true, parameters); return false; } final List<ParameterParser> customParsers = new ArrayList<ParameterParser>(); for (final CompileParameter cp : parameters) { if (cp instanceof ParameterParser) { customParsers.add((ParameterParser) cp); } } final List<String> errors = new ArrayList<String>(); for (String a : args) { if (a.startsWith("-") || a.startsWith("/")) a = a.substring(1); final int eq = a.indexOf('='); final String name = a.substring(0, eq != -1 ? eq : a.length()); final String value = eq == -1 ? null : a.substring(eq + 1); final CompileParameter cp = from(name, parameters); if (cp == null) { boolean matched = false; for (final ParameterParser parser : customParsers) { final Either<Boolean> tryParse = parser.tryParse(name, value, context); if (!tryParse.isSuccess()) { errors.add(tryParse.explainError()); matched = true; break; } else if (tryParse.get()) { matched = true; break; } } if (!matched) { errors.add("Unknown parameter: " + name); } } else { if (eq == -1 && cp.getUsage() != null) { if (cp instanceof ParameterParser) { Either<Boolean> tryParse = ((ParameterParser) cp).tryParse(name, null, context); if (tryParse.isSuccess() && tryParse.get()) { context.put(cp, null); } else { errors.add("Expecting " + cp.getUsage() + " after = for " + a); } } else { errors.add("Expecting " + cp.getUsage() + " after = for " + a); } } else { context.put(cp, value); } } } if (args.length == 0 || errors.size() > 0) { for (final String err : errors) { context.error(err); } showHelpAndExit(context, args.length == errors.size(), parameters); return false; } return true; }