Minestom/code-generators/src/main/java/net/minestom/codegen/color/DyeColorGenerator.java

146 lines
7.5 KiB
Java

package net.minestom.codegen.color;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.squareup.javapoet.*;
import net.minestom.codegen.MinestomCodeGenerator;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.lang.model.element.Modifier;
import java.io.File;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Comparator;
import java.util.List;
import java.util.stream.StreamSupport;
public class DyeColorGenerator extends MinestomCodeGenerator {
private static final Logger LOGGER = LoggerFactory.getLogger(DyeColorGenerator.class);
private final InputStream dyeColorsFile;
private final File outputFolder;
public DyeColorGenerator(@Nullable InputStream dyeColorsFile, @NotNull File outputFolder) {
this.dyeColorsFile = dyeColorsFile;
this.outputFolder = outputFolder;
}
@Override
public void generate() {
if (dyeColorsFile == null) {
LOGGER.error("Failed to find dye_colors.json.");
LOGGER.error("Stopped code generation for dye colors.");
return;
}
if (!outputFolder.exists() && !outputFolder.mkdirs()) {
LOGGER.error("Output folder for code generation does not exist and could not be created.");
return;
}
// Important classes we use alot
ClassName colorCN = ClassName.get("net.minestom.server.color", "Color");
JsonArray dyeColors = GSON.fromJson(new InputStreamReader(dyeColorsFile), JsonArray.class);
ClassName dyeColorCN = ClassName.get("net.minestom.server.color", "DyeColor");
// Dye Color Enum
TypeSpec.Builder dyeColorEnum = TypeSpec.enumBuilder(dyeColorCN)
.addSuperinterface(ClassName.get("net.kyori.adventure.util", "RGBLike"))
.addModifiers(Modifier.PUBLIC).addJavadoc("AUTOGENERATED by " + getClass().getSimpleName());
// Fields
dyeColorEnum.addFields(
List.of(
FieldSpec.builder(colorCN, "textureDiffuseColor", Modifier.PRIVATE, Modifier.FINAL).build(),
FieldSpec.builder(colorCN, "textColor", Modifier.PRIVATE, Modifier.FINAL).build(),
FieldSpec.builder(colorCN, "fireworkColor", Modifier.PRIVATE, Modifier.FINAL).build(),
FieldSpec.builder(TypeName.INT, "mapColorId", Modifier.PRIVATE, Modifier.FINAL).build()
)
);
// Methods
dyeColorEnum.addMethods(
List.of(
// Constructor
MethodSpec.constructorBuilder()
.addParameters(
List.of(
ParameterSpec.builder(colorCN, "textureDiffuseColor").addAnnotation(NotNull.class).build(),
ParameterSpec.builder(colorCN, "textColor").addAnnotation(NotNull.class).build(),
ParameterSpec.builder(colorCN, "fireworkColor").addAnnotation(NotNull.class).build(),
ParameterSpec.builder(TypeName.INT, "mapColorId").build()
)
)
.addStatement("this.textureDiffuseColor = textureDiffuseColor")
.addStatement("this.textColor = textColor")
.addStatement("this.fireworkColor = fireworkColor")
.addStatement("this.mapColorId = mapColorId")
.build(),
MethodSpec.methodBuilder("color")
.addModifiers(Modifier.PUBLIC)
.returns(colorCN.annotated(AnnotationSpec.builder(NotNull.class).build()))
.addStatement("return this.textureDiffuseColor")
.build(),
MethodSpec.methodBuilder("textColor")
.addModifiers(Modifier.PUBLIC)
.returns(colorCN.annotated(AnnotationSpec.builder(NotNull.class).build()))
.addStatement("return this.textColor")
.build(),
MethodSpec.methodBuilder("fireworkColor")
.addModifiers(Modifier.PUBLIC)
.returns(colorCN.annotated(AnnotationSpec.builder(NotNull.class).build()))
.addStatement("return this.fireworkColor")
.build(),
MethodSpec.methodBuilder("red")
.addModifiers(Modifier.PUBLIC)
.returns(TypeName.INT)
.addAnnotation(Override.class)
.addStatement("return this.textureDiffuseColor.red()")
.build(),
MethodSpec.methodBuilder("green")
.returns(TypeName.INT)
.addModifiers(Modifier.PUBLIC)
.addAnnotation(Override.class)
.addStatement("return this.textureDiffuseColor.green()")
.build(),
MethodSpec.methodBuilder("blue")
.returns(TypeName.INT)
.addModifiers(Modifier.PUBLIC)
.addAnnotation(Override.class)
.addStatement("return this.textureDiffuseColor.blue()")
.build(),
MethodSpec.methodBuilder("mapColorId")
.addModifiers(Modifier.PUBLIC)
.returns(TypeName.INT)
.addStatement("return this.mapColorId")
.build()
)
);
// Use data
for (JsonObject dyeColorObject : StreamSupport.stream(dyeColors.spliterator(), true).map(JsonElement::getAsJsonObject).sorted(Comparator.comparingInt(o -> o.get("id").getAsInt())).toList()) {
String dyeColorName = dyeColorObject.get("name").getAsString();
dyeColorEnum.addEnumConstant(toConstant(dyeColorName), TypeSpec.anonymousClassBuilder(
"new $T(0x$L), new $T(0x$L), new $T(0x$L), $L",
colorCN, Integer.toString(dyeColorObject.get("textureDiffuseColor").getAsInt(), 16),
colorCN, Integer.toString(dyeColorObject.get("textColor").getAsInt(), 16),
colorCN, Integer.toString(dyeColorObject.get("fireworkColor").getAsInt(), 16),
dyeColorObject.get("mapColorId").getAsInt()
).build()
);
}
// Write files to outputFolder
writeFiles(
List.of(
JavaFile.builder("net.minestom.server.color", dyeColorEnum.build())
.indent(" ")
.skipJavaLangImports(true)
.build()
),
outputFolder
);
}
}