Refactoring builders to be easier to use

This commit is contained in:
Auxilor
2021-06-17 11:25:54 +01:00
parent 74ca2e82ef
commit b6f27ee232
5 changed files with 245 additions and 166 deletions

View File

@@ -6,7 +6,7 @@ import org.bukkit.enchantments.Enchantment;
import org.bukkit.inventory.meta.EnchantmentStorageMeta;
import org.jetbrains.annotations.NotNull;
public class EnchantedBookBuilder extends AbstractItemStackBuilder<EnchantmentStorageMeta> {
public class EnchantedBookBuilder extends AbstractItemStackBuilder<EnchantmentStorageMeta, EnchantedBookBuilder> {
/**
* Create a new EnchantedBookBuilder.
*/

View File

@@ -0,0 +1,182 @@
package com.willfp.eco.core.items.builder;
import org.bukkit.NamespacedKey;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.inventory.ItemFlag;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.persistence.PersistentDataType;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.List;
import java.util.function.Supplier;
public interface ItemBuilder<T extends ItemMeta, U extends ItemBuilder<T, U>> {
/**
* Set the ItemStack amount.
*
* @param amount The amount.
* @return The builder.
*/
U setAmount(int amount);
/**
* Set the ItemStack amount.
*
* @param amount The amount.
* @return The builder.
*/
U setAmount(@NotNull Supplier<Integer> amount);
/**
* Add an enchantment to the item.
*
* @param enchantment The enchantment.
* @param level The level.
* @return The builder.r
*/
U addEnchantment(@NotNull Enchantment enchantment,
int level);
/**
* Add an enchantment to the item.
*
* @param enchantment The enchantment.
* @param level The level.
* @return The builder.
*/
U addEnchantment(@NotNull Supplier<Enchantment> enchantment,
@NotNull Supplier<Integer> level);
/**
* Set the item display name.
*
* @param name The name.
* @return The builder.
*/
U setDisplayName(@NotNull String name);
/**
* Set the item display name.
*
* @param name The name.
* @return The builder.
*/
U setDisplayName(@NotNull Supplier<String> name);
/**
* Add lore line.
*
* @param line The line.
* @return The builder.
*/
U addLoreLine(@NotNull String line);
/**
* Add lore line.
*
* @param line The line.
* @return The builder.
*/
U addLoreLine(@NotNull Supplier<String> line);
/**
* Add lore lines.
*
* @param lines The lines.
* @return The builder.
*/
U addLoreLines(@NotNull List<String> lines);
/**
* Add lore lines.
*
* @param lines The lines.
* @return The builder.
*/
U addLoreLines(@NotNull Supplier<List<String>> lines);
/**
* Add ItemFlags.
*
* @param itemFlags The flags.
* @return The builder.
*/
U addItemFlag(@NotNull ItemFlag... itemFlags);
/**
* Add ItemFlags.
*
* @param itemFlags The flags.
* @return The builder.
*/
U addItemFlag(@NotNull Supplier<ItemFlag[]> itemFlags);
/**
* Write meta key.
*
* @param key The key.
* @param type The type.
* @param value The value.
* @param <A> The type.
* @param <B> The type.
* @return The builder.
*/
<A, B> U writeMetaKey(@NotNull NamespacedKey key,
@NotNull PersistentDataType<A, B> type,
@NotNull B value);
/**
* Write meta key.
*
* @param key The key.
* @param type The type.
* @param value The value.
* @param <A> The type.
* @param <B> The type.
* @return The builder.
*/
<A, B> U writeMetaKey(@NotNull Supplier<NamespacedKey> key,
@NotNull Supplier<PersistentDataType<A, B>> type,
@NotNull Supplier<B> value);
/**
* Set unbreakable.
*
* @param unbreakable If the item should be unbreakable.
* @return The builder.
*/
U setUnbreakable(boolean unbreakable);
/**
* Set unbreakable.
*
* @param unbreakable If the item should be unbreakable.
* @return The builder.
*/
U setUnbreakable(@NotNull Supplier<Boolean> unbreakable);
/**
* Set custom model data.
*
* @param data The data.
* @return The builder.
*/
U setCustomModelData(@Nullable Integer data);
/**
* Set custom model data.
*
* @param data The data.
* @return The builder.
*/
U setCustomModelData(@NotNull Supplier<Integer> data);
/**
* Build the item.
*
* @return The item.
*/
ItemStack build();
}

View File

@@ -6,7 +6,7 @@ import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.jetbrains.annotations.NotNull;
public class ItemStackBuilder extends AbstractItemStackBuilder<ItemMeta> {
public class ItemStackBuilder extends AbstractItemStackBuilder<ItemMeta, ItemStackBuilder> {
/**
* Create a new ItemStackBuilder.
*

View File

@@ -6,7 +6,7 @@ import org.bukkit.Material;
import org.bukkit.inventory.meta.SkullMeta;
import org.jetbrains.annotations.NotNull;
public class SkullBuilder extends AbstractItemStackBuilder<SkullMeta> {
public class SkullBuilder extends AbstractItemStackBuilder<SkullMeta, SkullBuilder> {
/**
* Create a new EnchantedBookBuilder.
*/

View File

@@ -1,5 +1,6 @@
package com.willfp.eco.internal.items;
import com.willfp.eco.core.items.builder.ItemBuilder;
import com.willfp.eco.util.StringUtils;
import lombok.AccessLevel;
import lombok.Getter;
@@ -19,7 +20,7 @@ import java.util.List;
import java.util.function.Supplier;
@SuppressWarnings("unchecked")
public abstract class AbstractItemStackBuilder<T extends ItemMeta> {
public abstract class AbstractItemStackBuilder<T extends ItemMeta, U extends AbstractItemStackBuilder<T, U>> implements ItemBuilder<T, U> {
/**
* The ItemMeta used while building.
*/
@@ -52,110 +53,63 @@ public abstract class AbstractItemStackBuilder<T extends ItemMeta> {
assert meta != null;
}
/**
* Set the ItemStack amount.
*
* @param amount The amount.
* @return The builder.
*/
public AbstractItemStackBuilder<T> setAmount(final int amount) {
@Override
public U setAmount(final int amount) {
Validate.isTrue(amount >= 1 && amount <= base.getMaxStackSize());
base.setAmount(amount);
return this;
return (U) this;
}
/**
* Set the ItemStack amount.
*
* @param amount The amount.
* @return The builder.
*/
public AbstractItemStackBuilder<T> setAmount(@NotNull final Supplier<Integer> amount) {
@Override
public U setAmount(@NotNull final Supplier<Integer> amount) {
return setAmount(amount.get());
}
/**
* Add an enchantment to the item.
*
* @param enchantment The enchantment.
* @param level The level.
* @return The builder.
*/
public AbstractItemStackBuilder<T> addEnchantment(@NotNull final Enchantment enchantment,
final int level) {
@Override
public U addEnchantment(@NotNull final Enchantment enchantment,
final int level) {
meta.addEnchant(enchantment, level, true);
return this;
return (U) this;
}
/**
* Add an enchantment to the item.
*
* @param enchantment The enchantment.
* @param level The level.
* @return The builder.
*/
public AbstractItemStackBuilder<T> addEnchantment(@NotNull final Supplier<Enchantment> enchantment,
@NotNull final Supplier<Integer> level) {
@Override
public U addEnchantment(@NotNull final Supplier<Enchantment> enchantment,
@NotNull final Supplier<Integer> level) {
return addEnchantment(enchantment.get(), level.get());
}
/**
* Set the item display name.
*
* @param name The name.
* @return The builder.
*/
public AbstractItemStackBuilder<T> setDisplayName(@NotNull final String name) {
@Override
public U setDisplayName(@NotNull final String name) {
meta.setDisplayName(StringUtils.translate(name));
return this;
return (U) this;
}
/**
* Set the item display name.
*
* @param name The name.
* @return The builder.
*/
public AbstractItemStackBuilder<T> setDisplayName(@NotNull final Supplier<String> name) {
@Override
public U setDisplayName(@NotNull final Supplier<String> name) {
String result = name.get();
return result == null ? this : setDisplayName(name.get());
return result == null ? (U) this : setDisplayName(name.get());
}
/**
* Add lore line.
*
* @param line The line.
* @return The builder.
*/
public AbstractItemStackBuilder<T> addLoreLine(@NotNull final String line) {
@Override
public U addLoreLine(@NotNull final String line) {
List<String> lore = meta.hasLore() ? meta.getLore() : new ArrayList<>();
assert lore != null;
lore.add(StringUtils.translate(line));
meta.setLore(lore);
return this;
return (U) this;
}
/**
* Add lore line.
*
* @param line The line.
* @return The builder.
*/
public AbstractItemStackBuilder<T> addLoreLine(@NotNull final Supplier<String> line) {
@Override
public U addLoreLine(@NotNull final Supplier<String> line) {
String result = line.get();
return result == null ? this : addLoreLine(line.get());
return result == null ? (U) this : addLoreLine(line.get());
}
/**
* Add lore lines.
*
* @param lines The lines.
* @return The builder.
*/
public AbstractItemStackBuilder<T> addLoreLines(@NotNull final List<String> lines) {
@Override
public U addLoreLines(@NotNull final List<String> lines) {
List<String> lore = meta.hasLore() ? meta.getLore() : new ArrayList<>();
assert lore != null;
for (String line : lines) {
@@ -163,132 +117,75 @@ public abstract class AbstractItemStackBuilder<T extends ItemMeta> {
}
meta.setLore(lore);
return this;
return (U) this;
}
/**
* Add lore lines.
*
* @param lines The lines.
* @return The builder.
*/
public AbstractItemStackBuilder<T> addLoreLines(@NotNull final Supplier<List<String>> lines) {
@Override
public U addLoreLines(@NotNull final Supplier<List<String>> lines) {
List<String> result = lines.get();
return result == null ? this : addLoreLines(lines.get());
return result == null ? (U) this : addLoreLines(lines.get());
}
/**
* Add ItemFlags.
*
* @param itemFlags The flags.
* @return The builder.
*/
public AbstractItemStackBuilder<T> addItemFlag(@NotNull final ItemFlag... itemFlags) {
@Override
public U addItemFlag(@NotNull final ItemFlag... itemFlags) {
meta.addItemFlags(itemFlags);
return this;
return (U) this;
}
/**
* Add ItemFlags.
*
* @param itemFlags The flags.
* @return The builder.
*/
public AbstractItemStackBuilder<T> addItemFlag(@NotNull final Supplier<ItemFlag[]> itemFlags) {
@Override
public U addItemFlag(@NotNull final Supplier<ItemFlag[]> itemFlags) {
ItemFlag[] result = itemFlags.get();
return result == null ? this : addItemFlag(result);
return result == null ? (U) this : addItemFlag(result);
}
/**
* Write meta key.
*
* @param key The key.
* @param type The type.
* @param value The value.
* @param <A> The type.
* @param <B> The type.
* @return The builder.
*/
public <A, B> AbstractItemStackBuilder<T> writeMetaKey(@NotNull final NamespacedKey key,
@NotNull final PersistentDataType<A, B> type,
@NotNull final B value) {
@Override
public <A, B> U writeMetaKey(@NotNull final NamespacedKey key,
@NotNull final PersistentDataType<A, B> type,
@NotNull final B value) {
meta.getPersistentDataContainer().set(key, type, value);
return this;
return (U) this;
}
/**
* Write meta key.
*
* @param key The key.
* @param type The type.
* @param value The value.
* @param <A> The type.
* @param <B> The type.
* @return The builder.
*/
public <A, B> AbstractItemStackBuilder<T> writeMetaKey(@NotNull final Supplier<NamespacedKey> key,
@NotNull final Supplier<PersistentDataType<A, B>> type,
@NotNull final Supplier<B> value) {
@Override
public <A, B> U writeMetaKey(@NotNull final Supplier<NamespacedKey> key,
@NotNull final Supplier<PersistentDataType<A, B>> type,
@NotNull final Supplier<B> value) {
return writeMetaKey(key.get(), type.get(), value.get());
}
/**
* Set unbreakable.
*
* @param unbreakable If the item should be unbreakable.
* @return The builder.
*/
public AbstractItemStackBuilder<T> setUnbreakable(final boolean unbreakable) {
@Override
public U setUnbreakable(final boolean unbreakable) {
meta.setUnbreakable(unbreakable);
return this;
return (U) this;
}
/**
* Set unbreakable.
*
* @param unbreakable If the item should be unbreakable.
* @return The builder.
*/
public AbstractItemStackBuilder<T> setUnbreakable(@NotNull final Supplier<Boolean> unbreakable) {
@Override
public U setUnbreakable(@NotNull final Supplier<Boolean> unbreakable) {
Boolean result = unbreakable.get();
return result == null ? this : setUnbreakable(unbreakable);
return result == null ? (U) this : setUnbreakable(unbreakable);
}
/**
* Set custom model data.
*
* @param data The data.
* @return The builder.
*/
public AbstractItemStackBuilder<T> setCustomModelData(@Nullable final Integer data) {
@Override
public U setCustomModelData(@Nullable final Integer data) {
meta.setCustomModelData(data);
return this;
return (U) this;
}
/**
* Set custom model data.
*
* @param data The data.
* @return The builder.
*/
public AbstractItemStackBuilder<T> setCustomModelData(@NotNull final Supplier<Integer> data) {
@Override
public U setCustomModelData(@NotNull final Supplier<Integer> data) {
Integer result = data.get();
return result == null ? this : setCustomModelData(result);
return result == null ? (U) this : setCustomModelData(result);
}
/**
* Build the item.
*
* @return The item.
*/
@Override
public ItemStack build() {
base.setItemMeta(meta);