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}