diff options
Diffstat (limited to 'src/main/java/moe')
| -rw-r--r-- | src/main/java/moe/nea/prickly/Main.java | 10 | ||||
| -rw-r--r-- | src/main/java/moe/nea/prickly/config/Config.java | 11 | ||||
| -rw-r--r-- | src/main/java/moe/nea/prickly/config/ConfigCompat.java | 41 | ||||
| -rw-r--r-- | src/main/java/moe/nea/prickly/config/ConfigPath.java | 57 | ||||
| -rw-r--r-- | src/main/java/moe/nea/prickly/config/package-info.java | 4 | ||||
| -rw-r--r-- | src/main/java/moe/nea/prickly/package-info.java | 4 | ||||
| -rw-r--r-- | src/main/java/moe/nea/prickly/server/Server.java | 32 | ||||
| -rw-r--r-- | src/main/java/moe/nea/prickly/server/package-info.java | 4 |
8 files changed, 163 insertions, 0 deletions
diff --git a/src/main/java/moe/nea/prickly/Main.java b/src/main/java/moe/nea/prickly/Main.java new file mode 100644 index 0000000..bed9b61 --- /dev/null +++ b/src/main/java/moe/nea/prickly/Main.java @@ -0,0 +1,10 @@ +package moe.nea.prickly; + +import moe.nea.prickly.server.Server; + +public class Main { + public static void main(String[] args) { + new Server() + .start(); + } +}
\ No newline at end of file diff --git a/src/main/java/moe/nea/prickly/config/Config.java b/src/main/java/moe/nea/prickly/config/Config.java new file mode 100644 index 0000000..4c6e533 --- /dev/null +++ b/src/main/java/moe/nea/prickly/config/Config.java @@ -0,0 +1,11 @@ +package moe.nea.prickly.config; + +import java.util.function.Supplier; + +public class Config { + private static ConfigPath + ROOT = new ConfigPath("PRICKLY"), + NET = ROOT.join("NET"); + public static int PORT = NET.join("PORT").requireInt(); + public static String HOST = NET.join("HOST").getString().orElse("0"); +} diff --git a/src/main/java/moe/nea/prickly/config/ConfigCompat.java b/src/main/java/moe/nea/prickly/config/ConfigCompat.java new file mode 100644 index 0000000..38291c5 --- /dev/null +++ b/src/main/java/moe/nea/prickly/config/ConfigCompat.java @@ -0,0 +1,41 @@ +package moe.nea.prickly.config; + +import lombok.extern.slf4j.Slf4j; +import org.jspecify.annotations.Nullable; + +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Map; +import java.util.Properties; + +@Slf4j +public class ConfigCompat { + public static final Path ENV_FILE = Path.of(".env").toAbsolutePath(); + + @SuppressWarnings({"unchecked", "rawtypes"}) + private static Map<String, String> loadDotenv() { + var properties = new Properties(); + if (!Files.exists(ENV_FILE)) { + log.info("no .env file found at {}", ENV_FILE); + } else { + try (var reader = Files.newBufferedReader(ENV_FILE, StandardCharsets.UTF_8)) { + properties.load(reader); + log.info("loaded environment from {} ({} entries)", ENV_FILE, properties.size()); + } catch (IOException e) { + log.error("could not read .env file at {}", ENV_FILE, e); + } + } + return (Map) properties; + } + + public static Map<String, String> DOTENV_FALLBACK = loadDotenv(); + + public static @Nullable String getEnv(String key) { + var value = System.getenv(key); + if (value != null) + return value; + return DOTENV_FALLBACK.get(key); + } +} diff --git a/src/main/java/moe/nea/prickly/config/ConfigPath.java b/src/main/java/moe/nea/prickly/config/ConfigPath.java new file mode 100644 index 0000000..3311910 --- /dev/null +++ b/src/main/java/moe/nea/prickly/config/ConfigPath.java @@ -0,0 +1,57 @@ +package moe.nea.prickly.config; + +import lombok.extern.slf4j.Slf4j; + +import java.util.Optional; +import java.util.function.Supplier; + +@Slf4j +public record ConfigPath(String path) { + public ConfigPath join(String extraPath) { + return new ConfigPath(path + "_" + extraPath); + } + + public Optional<String> getString() { + return Optional.ofNullable(ConfigCompat.getEnv(path)); + } + + public Optional<Integer> 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<Boolean> 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<Boolean> OPT_TRUE = Optional.of(true), + OPT_FALSE = Optional.of(false); + + public Supplier<RuntimeException> requireMessage() { + return () -> new RuntimeException("missing required value at path " + path()); + } + + public String requireString() { + return getString().orElseThrow(requireMessage()); + } + + public int requireInt() { + return getInt().orElseThrow(requireMessage()); + } +} diff --git a/src/main/java/moe/nea/prickly/config/package-info.java b/src/main/java/moe/nea/prickly/config/package-info.java new file mode 100644 index 0000000..06b9251 --- /dev/null +++ b/src/main/java/moe/nea/prickly/config/package-info.java @@ -0,0 +1,4 @@ +@NullMarked +package moe.nea.prickly.config; + +import org.jspecify.annotations.NullMarked;
\ No newline at end of file diff --git a/src/main/java/moe/nea/prickly/package-info.java b/src/main/java/moe/nea/prickly/package-info.java new file mode 100644 index 0000000..b317278 --- /dev/null +++ b/src/main/java/moe/nea/prickly/package-info.java @@ -0,0 +1,4 @@ +@NullMarked +package moe.nea.prickly; + +import org.jspecify.annotations.NullMarked;
\ No newline at end of file diff --git a/src/main/java/moe/nea/prickly/server/Server.java b/src/main/java/moe/nea/prickly/server/Server.java new file mode 100644 index 0000000..cbb9804 --- /dev/null +++ b/src/main/java/moe/nea/prickly/server/Server.java @@ -0,0 +1,32 @@ +package moe.nea.prickly.server; + +import io.javalin.Javalin; +import io.javalin.config.JavalinConfig; +import lombok.extern.slf4j.Slf4j; +import moe.nea.prickly.config.Config; + +@Slf4j +public class Server { + Javalin javalin; + + public Server() { + log.info("creating server instance"); + javalin = Javalin.create(this::configure); + installRoutes(); + } + + protected void installRoutes() { + log.info("installing routes"); + } + + protected void configure(JavalinConfig config) { + log.info("configuring javalin"); + } + + public void start() { + var port = Config.PORT; + var host = Config.HOST; + log.info("starting on port http://{}:{}", host, port); + javalin.start(host, port); + } +} diff --git a/src/main/java/moe/nea/prickly/server/package-info.java b/src/main/java/moe/nea/prickly/server/package-info.java new file mode 100644 index 0000000..32acf65 --- /dev/null +++ b/src/main/java/moe/nea/prickly/server/package-info.java @@ -0,0 +1,4 @@ +@NullMarked +package moe.nea.prickly.server; + +import org.jspecify.annotations.NullMarked;
\ No newline at end of file |
