package dev.isxander.yacl.api; import dev.isxander.yacl.impl.GenericBindingImpl; import dev.isxander.yacl.mixin.SimpleOptionAccessor; import net.minecraft.client.option.SimpleOption; import org.apache.commons.lang3.Validate; import java.util.function.Consumer; import java.util.function.Supplier; /** * Controls modifying the bound option. * Provides the default value, a setter and a getter. */ public interface Binding { void setValue(T value); T getValue(); T defaultValue(); /** * Creates a generic binding. * * @param def default value of the option, used to reset * @param getter should return the current value of the option * @param setter should set the option to the supplied value */ static Binding generic(T def, Supplier getter, Consumer setter) { Validate.notNull(def, "`def` must not be null"); Validate.notNull(getter, "`getter` must not be null"); Validate.notNull(setter, "`setter` must not be null"); return new GenericBindingImpl<>(def, getter, setter); } /** * Creates a {@link Binding} for Minecraft's {@link SimpleOption} */ static Binding minecraft(SimpleOption minecraftOption) { Validate.notNull(minecraftOption, "`minecraftOption` must not be null"); return new GenericBindingImpl<>( ((SimpleOptionAccessor) (Object) minecraftOption).getDefaultValue(), minecraftOption::getValue, minecraftOption::setValue ); } }