package squill.generate;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import static java.lang.String.format;
public class TupleGenerator {
private final String path;
private final String pkg;
private final int count;
public TupleGenerator(final String path, String pkg, final int count) {
this.path = path;
this.pkg = pkg;
this.count = count;
}
public static void main(final String[] args) {
//new TupleGenerator("src", "squill.api.tuple", 2).generate();
new TupleGenerator(args[0], args[1], Integer.parseInt(args[2])).generate();
}
public void generate() {
for (int i = 1; i <= count; i++) {
final String fileContents = generate(i);
final String fileName = fileName(i);
writeFile(fileContents, fileName);
}
}
protected String fileName(int i) {
return path + "/" + pkg.replace('.', '/') + "/Tuple" + i + ".java";
}
private void writeFile(final String contents, final String fileName) {
try {
final BufferedWriter writer = new BufferedWriter(new FileWriter(fileName));
writer.write(contents);
writer.close();
} catch (IOException ioe) {
throw new RuntimeException("Error writing file " + fileName, ioe);
}
}
public String generate(final int i) {
final StringBuilder sb = new StringBuilder();
sb.append(format("package %s;%n", getPackage()));
sb.append(format("public class Tuple%d<%s> implements Tuple {%n", i, gen(i, "T%d", ",")));
sb.append(gen(i, " public final T%1$d v%1$d;%n", ""));
sb.append(format(" public Tuple%d(%s) {%n %s }%n", i, gen(i, "T%1$d v%1$d", ","),
gen(i, " this.v%1$d = v%1$d;%n", "")
));
sb.append(format(" public static <%2$s> Tuple%1$d<%2$s> _(%3$s) {%n return new Tuple%1$d<%2$s>(%4$s);%n }%n",
i, gen(i, "P%d", ","),
gen(i, "P%1$d v%1$d", ", "),
gen(i, "v%d", ", ")
));
sb.append(format("@Override%npublic String toString() {%n return \"(\"+%s+\")\";%n}%n", gen(i, "v%d", " + \", \" + ")));
sb.append(format(
" @Override %n" +
" public boolean equals(Object o) { %n" +
" if (this == o) return true; %n" +
" if (o == null || getClass() != o.getClass()) return false; %n" +
" Tuple%1$d tuple = (Tuple%1$d) o; %n" +
" %2$s " +
" return true; %n" +
" }%n", i, gen(i, " if (v%1$d == null ? tuple.v%1$d != null : !v%1$d.equals(tuple.v%1$d)) return false; %n", "")));
sb.append(format(
" @Override %n" +
" public int hashCode() { %n" +
" int result = 0; %n" +
" %s " +
" return result;%n" +
" }%n", gen(i, " result = 31 * result + (v%1$d != null ? v%1$d.hashCode() : 0);%n", "")));
sb.append("}");
return sb.toString();
}
private String gen(final int count, final String pattern, final String delim) {
if (count < 1) return "";
final StringBuilder sb = new StringBuilder();
for (int i = 1; i <= count; i++) {
sb.append(delim).append(format(pattern, i));
}
return sb.length() > delim.length() ? sb.substring(delim.length()) : sb.toString();
}
private String getPackage() {
return pkg;
}
}
/*
@Override
public int hashCode() {
int result = v1 != null ? v1.hashCode() : 0;
result = 31 * result + (v2 != null ? v2.hashCode() : 0);
return result;
}
}
*/