RyanHub – file viewer
filename: common/src/main/java/rearth/oritech/api/fluid/containers/DelegatingFluidStorage.java
branch: 1.21
back to repo
package rearth.oritech.api.fluid.containers;

import dev.architectury.fluid.FluidStack;
import org.jetbrains.annotations.Nullable;
import rearth.oritech.Oritech;
import rearth.oritech.api.fluid.FluidApi;

import java.util.List;
import java.util.function.BooleanSupplier;
import java.util.function.Supplier;

public class DelegatingFluidStorage extends FluidApi.FluidStorage {
    
    protected final Supplier<FluidApi.FluidStorage> backingStorage;
    protected final BooleanSupplier validPredicate;
    
    public DelegatingFluidStorage(Supplier<FluidApi.FluidStorage> backingStorage, @Nullable BooleanSupplier validPredicate) {
        this.backingStorage = backingStorage;
        this.validPredicate = validPredicate == null ? () -> true : validPredicate;
    }
    
    public DelegatingFluidStorage(FluidApi.FluidStorage backingStorage, @Nullable BooleanSupplier validPredicate) {
        this(() -> backingStorage, validPredicate);
    }
    
    @Override
    public long insert(FluidStack toInsert, boolean simulate) {
        if (validPredicate.getAsBoolean())
            return backingStorage.get().insert(toInsert, simulate);
        return 0;
    }
    
    @Override
    public long extract(FluidStack toExtract, boolean simulate) {
        if (validPredicate.getAsBoolean())
            return backingStorage.get().extract(toExtract, simulate);
        return 0;
    }
    
    @Override
    public List<FluidStack> getContent() {
        if (validPredicate.getAsBoolean())
            return backingStorage.get().getContent();
        return List.of();
    }
    
    public void setContent(List<FluidStack> content) {
        if (validPredicate.getAsBoolean()) {
            // extract all, then insert new stacks
            var targetStorage = backingStorage.get();
            if (targetStorage instanceof FluidApi.SingleSlotStorage singleSlotContainer && content.size() == 1) {
                singleSlotContainer.setStack(content.getFirst());
            } else if (targetStorage instanceof FluidApi.InOutSlotStorage dualSlotContainer && content.size() == 2) {
                dualSlotContainer.setInStack(content.getFirst());
                dualSlotContainer.setOutStack(content.getLast());
            } else {
                Oritech.LOGGER.error("Using invalid container / snapshot for Delegating Fluid Storage");
            }
        }
    }
    
    @Override
    public void update() {
        if (validPredicate.getAsBoolean())
            backingStorage.get().update();
    }
    
    @Override
    public long getCapacity() {
        if (validPredicate.getAsBoolean())
            return backingStorage.get().getCapacity();
        
        return 0;
    }
    
    @Override
    public boolean supportsInsertion() {
        if (validPredicate.getAsBoolean())
            return backingStorage.get().supportsInsertion();
        
        return false;
    }
    
    @Override
    public boolean supportsExtraction() {
        if (validPredicate.getAsBoolean())
            return backingStorage.get().supportsExtraction();
        
        return false;
    }
}