diff --git a/core/src/main/java/com/livemotdmanager/core/ConfigLoader.java b/core/src/main/java/com/livemotdmanager/core/ConfigLoader.java index a63056d..6ada2f0 100644 --- a/core/src/main/java/com/livemotdmanager/core/ConfigLoader.java +++ b/core/src/main/java/com/livemotdmanager/core/ConfigLoader.java @@ -2,6 +2,10 @@ import org.yaml.snakeyaml.LoaderOptions; import org.yaml.snakeyaml.Yaml; +import org.yaml.snakeyaml.constructor.Constructor; +import org.yaml.snakeyaml.introspector.BeanAccess; +import org.yaml.snakeyaml.introspector.Property; +import org.yaml.snakeyaml.introspector.PropertyUtils; import java.io.InputStream; import java.io.InputStreamReader; @@ -15,9 +19,30 @@ private ConfigLoader() {} public static MotdConfig load(InputStream in) { LoaderOptions options = new LoaderOptions(); - Yaml yaml = new Yaml(options); + Constructor constructor = new Constructor(MotdConfig.class, options); + PropertyUtils utils = new PropertyUtils() { + @Override + public Property getProperty(Class type, String name, BeanAccess bAccess) { + // convert kebab-case (update-interval-minutes) to camelCase + StringBuilder sb = new StringBuilder(); + boolean upper = false; + for (char c : name.toCharArray()) { + if (c == '-') { + upper = true; + } else { + sb.append(upper ? Character.toUpperCase(c) : c); + upper = false; + } + } + return super.getProperty(type, sb.toString(), bAccess); + } + }; + utils.setSkipMissingProperties(true); + constructor.setPropertyUtils(utils); + Yaml yaml = new Yaml(constructor); + yaml.setBeanAccess(BeanAccess.FIELD); try (InputStreamReader reader = new InputStreamReader(in, StandardCharsets.UTF_8)) { - MotdConfig cfg = yaml.loadAs(reader, MotdConfig.class); + MotdConfig cfg = yaml.load(reader); if (cfg == null) cfg = new MotdConfig(); return cfg; } catch (Exception e) {