Minestom/code-generators/src/main/java/net/minestom/codegen/item/MaterialGenerator.java

72 lines
2.8 KiB
Java

package net.minestom.codegen.item;
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.List;
import java.util.Locale;
public final class MaterialGenerator extends MinestomCodeGenerator {
private static final Logger LOGGER = LoggerFactory.getLogger(MaterialGenerator.class);
private final InputStream itemsFile;
private final File outputFolder;
public MaterialGenerator(@Nullable InputStream itemsFile, @NotNull File outputFolder) {
this.itemsFile = itemsFile;
this.outputFolder = outputFolder;
}
@Override
public void generate() {
if (itemsFile == null) {
LOGGER.error("Failed to find items.json.");
LOGGER.error("Stopped code generation for items.");
return;
}
ClassName materialCN = ClassName.get("net.minestom.server.item", "Material");
JsonObject items;
items = GSON.fromJson(new InputStreamReader(itemsFile), JsonObject.class);
ClassName materialsCN = ClassName.get("net.minestom.server.item", "MaterialConstants");
// BlockConstants class
TypeSpec.Builder blockConstantsClass = TypeSpec.interfaceBuilder(materialsCN)
// Add @SuppressWarnings("unused")
.addAnnotation(AnnotationSpec.builder(SuppressWarnings.class).addMember("value", "$S", "unused").build())
.addJavadoc("AUTOGENERATED by " + getClass().getSimpleName());
// Use data
items.keySet().forEach(namespace -> {
final String constantName = namespace.replace("minecraft:", "").toUpperCase(Locale.ROOT);
blockConstantsClass.addField(
FieldSpec.builder(materialCN, constantName)
.addModifiers(Modifier.PUBLIC, Modifier.STATIC, Modifier.FINAL)
.initializer(
// Material.STONE = Material.fromNamespaceId("minecraft:stone")
"$T.fromNamespaceId($S)",
materialCN,
namespace
)
.build()
);
});
writeFiles(
List.of(
JavaFile.builder("net.minestom.server.item", blockConstantsClass.build())
.indent(" ")
.skipJavaLangImports(true)
.build()
),
outputFolder
);
}
}