ParticleParser.java
package it.fulminazzo.yagl.particles;
import it.fulminazzo.yagl.utils.EnumUtils;
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.ConfigurationSection;
import it.fulminazzo.yamlparser.configuration.IConfiguration;
import it.fulminazzo.yamlparser.parsers.YAMLParser;
/**
* A parser to serialize {@link Particle}.
*/
public class ParticleParser extends YAMLParser<Particle> {
/**
* Instantiates a new Particle parser.
*/
public ParticleParser() {
super(Particle.class);
}
@Override
protected BiFunctionException<IConfiguration, String, Particle> getLoader() {
return (c, s) -> {
ConfigurationSection particleSection = c.getConfigurationSection(s);
if (particleSection == null) return null;
String type = particleSection.getString("type");
if (type == null) throw new IllegalArgumentException("'type' cannot be null");
AParticleType<?> particleType;
try {
particleType = EnumUtils.valueOf(LegacyParticleType.class, type);
} catch (IllegalArgumentException e) {
particleType = EnumUtils.valueOf(ParticleType.class, type);
}
ParticleOption<?> option = null;
Class<? extends ParticleOption<?>> optionType = particleType.getOptionType();
if (optionType != null) option = particleSection.get("option", optionType);
Refl<?> refl = new Refl<>(particleType);
if (option == null) return refl.invokeMethod("create");
else return refl.invokeMethod("create", option);
};
}
@Override
protected TriConsumer<IConfiguration, String, Particle> getDumper() {
return (c, s, p) -> {
c.set(s, null);
if (p == null) return;
ConfigurationSection particleSection = c.createSection(s);
particleSection.set("type", p.getType());
particleSection.set("option", new Refl<>(p).getFieldObject("option"));
};
}
}