package fr.xephi.authme.settings.domain; import org.bukkit.configuration.file.YamlConfiguration; import java.util.Arrays; import java.util.List; import java.util.Objects; /** * Properties (i.e. a setting that is read from the config.yml file). */ public class Property { private final PropertyType type; private final String path; private final T defaultValue; private Property(PropertyType type, String path, T defaultValue) { Objects.requireNonNull(defaultValue); this.type = type; this.path = path; this.defaultValue = defaultValue; } public static Property newProperty(PropertyType type, String path, T defaultValue) { return new Property<>(type, path, defaultValue); } @SafeVarargs public static Property> newProperty(PropertyType> type, String path, U... defaultValues) { return new Property<>(type, path, Arrays.asList(defaultValues)); } public static > Property newProperty(Class clazz, String path, E defaultValue) { return new Property<>(new EnumPropertyType<>(clazz), path, defaultValue); } // ----- // Overloaded convenience methods for specific types // ----- public static Property newProperty(String path, boolean defaultValue) { return new Property<>(PropertyType.BOOLEAN, path, defaultValue); } public static Property newProperty(String path, int defaultValue) { return new Property<>(PropertyType.INTEGER, path, defaultValue); } public static Property newProperty(String path, String defaultValue) { return new Property<>(PropertyType.STRING, path, defaultValue); } // ----- // Hooks to the PropertyType methods // ----- /** * Get the property value from the given configuration. * * @param configuration The configuration to read the value from * @return The value, or default if not present */ public T getFromFile(YamlConfiguration configuration) { return type.getFromFile(this, configuration); } /** * Format the property value as YAML. * * @param configuration The configuration to read the value from * @return The property value as YAML */ public List formatValueAsYaml(YamlConfiguration configuration) { return type.asYaml(this, configuration); } // ----- // Trivial getters // ----- /** * Return the default value of the property. * * @return The default value */ public T getDefaultValue() { return defaultValue; } /** * Return the property path (i.e. the node at which this property is located in the YAML file). * * @return The path */ public String getPath() { return path; } @Override public String toString() { return "Property '" + path + "'"; } }