/* (C) 2025 Linnea Gräf - Licensed to everyone under the BSD 3 Clause License */ package moe.nea.prickly.config; import java.util.Optional; import java.util.function.Supplier; import java.util.stream.Stream; import lombok.extern.slf4j.Slf4j; @Slf4j public record ConfigPath(String path) { public ConfigPath join(String extraPath) { return new ConfigPath(path + "_" + extraPath); } public Optional getString() { return Optional.ofNullable(ConfigCompat.getEnv(path)); } public Stream findChildren() { return ConfigCompat.getAllDirectChildren(path).stream().map(this::join); } public Optional getInt() { var str = getString(); if (str.isPresent()) try { return Optional.of(Integer.parseInt(str.get())); } catch (NumberFormatException ex) { log.warn("could not parse config value at {}", path, ex); } return Optional.empty(); } public Optional getBoolean() { var str = getString(); if (str.isPresent()) { var sstr = str.get(); if (sstr.equalsIgnoreCase("true") || sstr.equals("1")) return OPT_TRUE; else if (sstr.equalsIgnoreCase("false") || sstr.equals("0")) return OPT_FALSE; else log.warn("could not parse boolean value at {}", path); } return Optional.empty(); } private static final Optional OPT_TRUE = Optional.of(true), OPT_FALSE = Optional.of(false); public Supplier requireMessage() { return () -> new RuntimeException("missing required value at path " + path()); } public String requireString() { return getString().orElseThrow(requireMessage()); } public int requireInt() { return getInt().orElseThrow(requireMessage()); } public String lastPart() { int index = path.lastIndexOf('_'); return path.substring(index + 1); } }