001package com.mrivanplays.annotationconfig.yaml;
002
003import com.mrivanplays.annotationconfig.core.resolver.ConfigResolver;
004import com.mrivanplays.annotationconfig.core.resolver.ValueWriter;
005import com.mrivanplays.annotationconfig.core.resolver.key.DottedResolver;
006import com.mrivanplays.annotationconfig.core.resolver.settings.ACDefaultSettings;
007import com.mrivanplays.annotationconfig.core.resolver.settings.Setting;
008import com.mrivanplays.annotationconfig.core.resolver.settings.Settings;
009import java.util.Collections;
010import java.util.LinkedHashMap;
011import java.util.Map;
012import org.yaml.snakeyaml.Yaml;
013
014/**
015 * Represents configuration, utilising YAML
016 *
017 * @since 1.0
018 * @author MrIvanPlays
019 */
020public final class YamlConfig {
021
022  private static final Yaml YAML = new Yaml();
023
024  /**
025   * Returns the {@link Setting} with which the yaml instance is referenced in the {@link Settings}
026   */
027  public static final Setting<Yaml> YAML_INSTANCE = Setting.of("yaml", Yaml.class);
028
029  private static ConfigResolver configResolver;
030
031  /**
032   * Returns the {@link ConfigResolver} instance of YamlConfig
033   *
034   * @return config resolver
035   */
036  public static ConfigResolver getConfigResolver() {
037    if (configResolver == null) {
038      generateConfigResolver();
039    }
040    return configResolver;
041  }
042
043  private static final ValueWriter YAML_VALUE_WRITER = new YamlValueWriter();
044
045  private static void generateConfigResolver() {
046    configResolver =
047        ConfigResolver.newBuilder()
048            .withKeyResolver(DottedResolver.getInstance())
049            .withValueWriter(YAML_VALUE_WRITER)
050            .withSetting(ACDefaultSettings.SHOULD_REVERSE_FIELDS, true)
051            .withCommentPrefix("# ")
052            .withFileExtension(".yml")
053            .withFileExtension(".yaml")
054            .withValueReader(
055                (reader, settings) -> {
056                  Map<String, Object> values =
057                      settings.get(YAML_INSTANCE).orElse(YAML).loadAs(reader, LinkedHashMap.class);
058                  if (values == null) {
059                    return Collections.emptyMap();
060                  }
061                  return values;
062                })
063            .build();
064  }
065}