package com.onthegomap.planetiler.custommap; import com.fasterxml.jackson.databind.ObjectMapper; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.io.UncheckedIOException; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; import org.snakeyaml.engine.v2.api.Load; import org.snakeyaml.engine.v2.api.LoadSettings; /** * Utility for parsing YAML files into java objects using snakeyaml to handle aliases and anchors and jackson to map * into java model objects. */ public class YAML { private YAML() {} private static final Load snakeYaml = new Load(LoadSettings.builder().build()); public static final ObjectMapper jackson = new ObjectMapper(); public static T load(Path file, Class clazz) { try (var schemaStream = Files.newInputStream(file)) { return load(schemaStream, clazz); } catch (IOException e) { throw new UncheckedIOException(e); } } public static T load(InputStream stream, Class clazz) { try (stream) { Object parsed = snakeYaml.loadFromInputStream(stream); return convertValue(parsed, clazz); } catch (IOException e) { throw new UncheckedIOException(e); } } public static T load(String config, Class clazz) { try (var stream = new ByteArrayInputStream(config.getBytes(StandardCharsets.UTF_8))) { return load(stream, clazz); } catch (IOException e) { throw new UncheckedIOException(e); } } public static T loadResource(String resourceName, Class clazz) { try (var stream = YAML.class.getResourceAsStream(resourceName)) { return load(stream, clazz); } catch (IOException e) { throw new UncheckedIOException(e); } } public static T convertValue(Object parsed, Class clazz) { return jackson.convertValue(parsed, clazz); } }