src/main/java/com/sleekbyte/tailor/format/XcodeFormatter.java
package com.sleekbyte.tailor.format;
import com.sleekbyte.tailor.common.ColorSettings;
import com.sleekbyte.tailor.common.Messages;
import com.sleekbyte.tailor.output.ViolationMessage;
import org.fusesource.jansi.Ansi;
import org.fusesource.jansi.AnsiConsole;
import java.io.File;
import java.io.IOException;
import java.util.Comparator;
import java.util.List;
/**
* Formatter that displays violation messages in an Xcode compatible format.
*/
public final class XcodeFormatter extends Formatter {
public XcodeFormatter(ColorSettings colorSettings) {
super(colorSettings);
}
public int getHighestLineNumber(List<ViolationMessage> violationMessages) {
return violationMessages.stream().max(Comparator.comparing(v -> v.getLineNumber())).get().getLineNumber();
}
public int getHighestColumnNumber(List<ViolationMessage> violationMessages) {
return violationMessages.stream().max(Comparator.comparing(v -> v.getColumnNumber())).get().getColumnNumber();
}
/**
* Returns a file header used to demarcate violation messages from different files.
*
* @param inputFile The input file
* @param colorSettings Color settings
* @return String containing the file header
* @throws IOException if file cannot be opened
*/
public static String getHeader(File inputFile, ColorSettings colorSettings) throws IOException {
if (colorSettings.colorOutput) {
String textColor = colorSettings.invertColor ? "white" : "black";
return String.format("%n@|bg_blue," + textColor + " **********|@ @|bg_green," + textColor
+ " %s|@ @|bg_blue," + textColor + " **********|@", inputFile.getCanonicalPath());
} else {
return String.format("%n********** %s **********", inputFile.toString());
}
}
@Override
public void displayViolationMessages(List<ViolationMessage> violationMessages, File inputFile) throws IOException {
if (violationMessages.size() > 0) {
printColoredMessage(getHeader(inputFile, colorSettings));
}
if (colorSettings.colorOutput) {
for (ViolationMessage output : violationMessages) {
output.setColorSettings(colorSettings);
output.setLineNumberWidth(String.valueOf(getHighestLineNumber(violationMessages)).length());
output.setColumnNumberWidth(String.valueOf(getHighestColumnNumber(violationMessages)).length());
AnsiConsole.out.println(Ansi.ansi().render(output.toString()));
}
} else {
violationMessages.forEach(System.out::println);
}
}
@Override
public void displayParseErrorMessage(File inputFile) throws IOException {
printColoredMessage(getHeader(inputFile, colorSettings));
System.out.println(inputFile + Messages.COULD_NOT_BE_PARSED);
}
@Override
public void displaySummary(long numFiles, long numSkipped, long numErrors, long numWarnings) {
System.out.println(Formatter.formatSummary(numFiles, numSkipped, numErrors, numWarnings));
}
private void printColoredMessage(String msg) {
if (colorSettings.colorOutput) {
AnsiConsole.out.println(Ansi.ansi().render(msg));
} else {
System.out.println(msg);
}
}
}