RecipeParser.java

package it.fulminazzo.yagl.parsers;

import it.fulminazzo.yagl.items.Item;
import it.fulminazzo.yagl.items.recipes.FurnaceRecipe;
import it.fulminazzo.yagl.items.recipes.Recipe;
import it.fulminazzo.fulmicollection.interfaces.functions.BiFunctionException;
import it.fulminazzo.fulmicollection.interfaces.functions.TriConsumer;
import it.fulminazzo.fulmicollection.objects.Refl;
import it.fulminazzo.yamlparser.configuration.IConfiguration;

import java.util.LinkedList;
import java.util.List;

/**
 * A parser to serialize {@link Recipe} and derivatives.
 */
public class RecipeParser extends TypedParser<Recipe> {

    /**
     * Instantiates a new Recipe parser.
     */
    public RecipeParser() {
        super(Recipe.class);
    }

    @Override
    protected BiFunctionException<IConfiguration, String, Recipe> getLoader() {
        return (c, s) -> {
            Recipe r = super.getLoader().apply(c, s);
            if (r == null) return null;
            if (r instanceof FurnaceRecipe) return r;
            List<Item> ingredients = c.getList(s + ".ingredients", Item.class);
            if (ingredients == null) ingredients = new LinkedList<>();
            return new Refl<>(r).setFieldObject("ingredients", ingredients).getObject();
        };
    }

    @Override
    protected TriConsumer<IConfiguration, String, Recipe> getDumper() {
        return super.getDumper().andThen((c, s, r) -> {
            if (r == null) return;
            if (!r.isEmpty()) c.set(s + ".ingredients.value-class", null);
        });
    }
}