Skip to content

Instantly share code, notes, and snippets.

@Exerosis
Created March 13, 2018 06:47
Show Gist options
  • Select an option

  • Save Exerosis/893d17d2e0fbe95a499c6ceaf206bbf5 to your computer and use it in GitHub Desktop.

Select an option

Save Exerosis/893d17d2e0fbe95a499c6ceaf206bbf5 to your computer and use it in GitHub Desktop.
public Mutable<Map<String, Object>> loadConfig(Path config) throws IOException {
final Yaml yaml = new Yaml();
final List<Pair<Boolean, Mutable<String>>> segments = new ArrayList<>();
final StringBuilder segment = new StringBuilder();
boolean data = true;
for (String line : new String(Files.readAllBytes(config)).split("\n"))
if (!line.startsWith("#") && data)
segment.append(line).append("\n");
else {
segments.add(new Pair<>(data, new MutableObject<>(segment.toString())));
segment.setLength(0);
data = !data;
}
List<Mutable<Map<String, Object>>> loadedSegments = segments.stream()
.filter(Pair::getKey)
.map(Pair::getValue)
.map(string -> new Mutable<Map<String, Object>>() {
final Map<String, Object> values = yaml.load(string.getValue());
@Override
public Map<String, Object> getValue() {
return values;
}
@Override
public void setValue(Map<String, Object> newValues) {
newValues.replaceAll((key, value) -> {
if (values.containsKey(key)) {
values.put(key, value);
return null;
}
return value;
});
}
}).collect(toList());
return new Mutable<Map<String, Object>>() {
@Override
public Map<String, Object> getValue() {
Map<String, Object> map = new HashMap<>();
loadedSegments.forEach(segment ->
map.putAll(segment.getValue())
);
return map;
}
@Override
public void setValue(Map<String, Object> value) {
loadedSegments.forEach(segment -> segment.setValue(value));
}
};
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment