package io.vertx.codegen.writer;
import java.io.PrintWriter;
import java.io.Writer;
import java.util.Locale;
import java.util.stream.Collectors;
import java.util.stream.Stream;
Class to simplify code write that maintains indentation status
Author: Francesco Guardiani @slinkydeveloper
/**
* Class to simplify code write that maintains indentation status
*
* @author <a href="http://slinkydeveloper.github.io">Francesco Guardiani @slinkydeveloper</a>
*/
public class CodeWriter extends PrintWriter {
private int indentSize = 2;
private int indent = 0;
private boolean first = true;
public CodeWriter(Writer out) {
super(out);
}
Returns: the current underlying writer
/**
* @return the current underlying writer
*/
public Writer writer() {
return out;
}
Returns: the current indentation size
/**
* @return the current indentation size
*/
public int indentSize() {
return indentSize;
}
Set the current indentation size, this can only be done when the current indentation is 0
. Params: - size – the new size
Returns: this object
/**
* Set the current indentation size, this can only be done when the current indentation is {@code 0}.
*
* @param size the new size
* @return this object
*/
public CodeWriter indentSize(int size) {
if (size < 0) {
throw new IllegalArgumentException();
}
indentSize = size;
return this;
}
Returns: the current indentation string
/**
* @return the current indentation string
*/
public String indentation() {
StringBuilder sb = new StringBuilder();
for (int i = 0;i < indent * indentSize;i++) {
sb.append(' ');
}
return sb.toString();
}
Increment the current indentation.
Returns: this object
/**
* Increment the current indentation.
*
* @return this object
*/
public CodeWriter indent() {
indent++;
return this;
}
Decrement the current indentation.
Returns: this object
/**
* Decrement the current indentation.
*
* @return this object
*/
public CodeWriter unindent() {
if (indent == 0) {
throw new IllegalStateException();
}
indent--;
return this;
}
public CodeWriter indented(Runnable block) {
indent();
block.run();
unindent();
return this;
}
Append the name
as a java package import. Returns: this object
/**
* Append the {@code name} as a java package import.
*
* @return this object
*/
public CodeWriter javaImport(String name) {
return append("import ").append(name).append(";").newLine();
}
Print the specified string
with an indent prefix. This method forces the writer to be the first line Params: - string – the string to print
Returns: this object
/**
* Print the specified {@code string} with an indent prefix.
*
* This method forces the writer to be the first line
*
* @param string the string to print
* @return this object
*/
public CodeWriter code(String string) {
if (!first) {
println();
}
print(string);
return this;
}
Print the specified line
with an indent prefix and end with a new line char. Params: - line – the line to print
Returns: this object
/**
* Print the specified {@code line} with an indent prefix and end with a new line char.
*
* @param line the line to print
* @return this object
*/
public CodeWriter codeln(String line) {
return code(line).newLine();
}
This function prints an indentation before the statement
and a semicolon followed by a newline after. Params: - statement – the statement
Returns: this object
/**
* This function prints an indentation before the {@code statement} and a semicolon followed by a newline
* after.
*
* @param statement the statement
* @return this object
*/
public CodeWriter stmt(String statement) {
return code(statement).append(";").newLine();
}
Print a new line char.
Returns: this object
/**
* Print a new line char.
*
* @return this object
*/
public CodeWriter newLine() {
println();
return this;
}
Write a sequence
delimited by a delimiter
. Returns: this object
/**
* Write a {@code sequence} delimited by a {@code delimiter}.
*
* @return this object
*/
public CodeWriter writeSeq(Stream<String> sequence, String delimiter) {
return append(sequence.collect(Collectors.joining(delimiter)));
}
public void println() {
print('\n');
}
@Override
public void write(String s, int off, int len) {
for (int i = 0;i < len;i++) {
write(s.charAt(off + i));
}
}
@Override
public void write(int c) {
if (c == '\n') {
first = true;
} else if (first) {
first = false;
for (int i = 0; i < indent * indentSize; i++) {
super.write(' ');
}
}
super.write(c);
}
@Override
public CodeWriter append(CharSequence csq) {
return (CodeWriter) super.append(csq);
}
@Override
public CodeWriter append(CharSequence csq, int start, int end) {
return (CodeWriter) super.append(csq, start, end);
}
@Override
public CodeWriter append(char c) {
return (CodeWriter) super.append(c);
}
@Override
public CodeWriter format(String format, Object... args) {
return (CodeWriter) super.format(format, args);
}
@Override
public CodeWriter format(Locale l, String format, Object... args) {
return (CodeWriter) super.format(l, format, args);
}
}