google-java-format-master/core/src/main/java/com/google/googlejavaformat/java/UsageException.java
/*
 * Copyright 2015 Google Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
 * in compliance with the License. You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software distributed under the License
 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
 * or implied. See the License for the specific language governing permissions and limitations under
 * the License.
 */

package com.google.googlejavaformat.java;

import static com.google.common.base.Preconditions.checkNotNull;

import com.google.common.base.Joiner;

/** Checked exception class for formatter command-line usage errors. */
final class UsageException extends Exception {

  private static final Joiner NEWLINE_JOINER = Joiner.on(System.lineSeparator());

  private static final String[] DOCS_LINK = {
    "https://github.com/google/google-java-format",
  };

  private static final String[] USAGE = {
    "",
    "Usage: google-java-format [options] file(s)",
    "",
    "Options:",
    "  -i, -r, -replace, --replace",
    "    Send formatted output back to files, not stdout.",
    "  -",
    "    Format stdin -> stdout",
    "  --assume-filename, -assume-filename",
    "    File name to use for diagnostics when formatting standard input (default is <stdin>).",
    "  --aosp, -aosp, -a",
    "    Use AOSP style instead of Google Style (4-space indentation).",
    "  --fix-imports-only",
    "    Fix import order and remove any unused imports, but do no other formatting.",
    "  --skip-sorting-imports",
    "    Do not fix the import order. Unused imports will still be removed.",
    "  --skip-removing-unused-imports",
    "    Do not remove unused imports. Imports will still be sorted.",
    "  --skip-reflowing-long-strings",
    "    Do not reflow string literals that exceed the column limit.",
    "  --skip-javadoc-formatting",
    "    Do not reformat javadoc.",
    "  --dry-run, -n",
    "    Prints the paths of the files whose contents would change if the formatter were run"
        + " normally.",
    "  --set-exit-if-changed",
    "    Return exit code 1 if there are any formatting changes.",
    "  --lines, -lines, --line, -line",
    "    Line range(s) to format, like 5:10 (1-based; default is all).",
    "  --offset, -offset",
    "    Character offset to format (0-based; default is all).",
    "  --length, -length",
    "    Character length to format.",
    "  --help, -help, -h",
    "    Print this usage statement.",
    "  --version, -version, -v",
    "    Print the version.",
    "  @<filename>",
    "    Read options and filenames from file.",
    "",
  };

  private static final String[] ADDITIONAL_USAGE = {
    "If -i is given with -, the result is sent to stdout.",
    "The --lines, --offset, and --length flags may be given more than once.",
    "The --offset and --length flags must be given an equal number of times.",
    "If --lines, --offset, or --length are given, only one file (or -) may be given."
  };

  UsageException() {
    super(buildMessage(null));
  }

  UsageException(String message) {
    super(buildMessage(checkNotNull(message)));
  }

  private static String buildMessage(String message) {
    StringBuilder builder = new StringBuilder();
    if (message != null) {
      builder.append(message).append('\n');
    }
    appendLines(builder, USAGE);
    appendLines(builder, ADDITIONAL_USAGE);
    appendLines(builder, new String[] {""});
    appendLine(builder, Main.versionString());
    appendLines(builder, DOCS_LINK);
    return builder.toString();
  }

  private static void appendLine(StringBuilder builder, String line) {
    builder.append(line).append(System.lineSeparator());
  }

  private static void appendLines(StringBuilder builder, String[] lines) {
    NEWLINE_JOINER.appendTo(builder, lines).append(System.lineSeparator());
  }
}
