From cb44def5d662e9ec15cf1d97d735c6deb129c302 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 24 Mar 2024 13:45:02 +0000 Subject: Add config for profiles --- .../org/shedlang/compiler/config/GcBumpConfig.java | 4 ++++ .../org/shedlang/compiler/config/GcConfig.java | 26 ++++++++++++++++++++++ .../compiler/config/GcMarkAndSweepConfig.java | 14 ++++++++++++ .../shedlang/compiler/config/ProfileConfig.java | 18 +++++++++++++++ .../shedlang/compiler/config/ProjectConfig.java | 14 ++++++++++-- 5 files changed, 74 insertions(+), 2 deletions(-) create mode 100644 src/main/java/org/shedlang/compiler/config/GcBumpConfig.java create mode 100644 src/main/java/org/shedlang/compiler/config/GcConfig.java create mode 100644 src/main/java/org/shedlang/compiler/config/GcMarkAndSweepConfig.java create mode 100644 src/main/java/org/shedlang/compiler/config/ProfileConfig.java (limited to 'src/main/java') diff --git a/src/main/java/org/shedlang/compiler/config/GcBumpConfig.java b/src/main/java/org/shedlang/compiler/config/GcBumpConfig.java new file mode 100644 index 00000000..bfbd7d4e --- /dev/null +++ b/src/main/java/org/shedlang/compiler/config/GcBumpConfig.java @@ -0,0 +1,4 @@ +package org.shedlang.compiler.config; + +public record GcBumpConfig() implements GcConfig { +} diff --git a/src/main/java/org/shedlang/compiler/config/GcConfig.java b/src/main/java/org/shedlang/compiler/config/GcConfig.java new file mode 100644 index 00000000..6d8ed950 --- /dev/null +++ b/src/main/java/org/shedlang/compiler/config/GcConfig.java @@ -0,0 +1,26 @@ +package org.shedlang.compiler.config; + +import org.tomlj.TomlTable; + +public sealed interface GcConfig permits GcBumpConfig, GcMarkAndSweepConfig { + GcConfig BUMP = new GcBumpConfig(); + + static GcConfig fromToml(TomlTable table) { + var name = table.getString("name"); + + if (name == null) { + throw new IllegalArgumentException("Missing GC name"); + } + + return switch (name) { + case "bump" -> + BUMP; + + case "mark-and-sweep" -> + GcMarkAndSweepConfig.fromToml(table); + + default -> + throw new IllegalArgumentException("Unrecognised GC name: \"%s\"".formatted(name)); + }; + } +} diff --git a/src/main/java/org/shedlang/compiler/config/GcMarkAndSweepConfig.java b/src/main/java/org/shedlang/compiler/config/GcMarkAndSweepConfig.java new file mode 100644 index 00000000..695654ea --- /dev/null +++ b/src/main/java/org/shedlang/compiler/config/GcMarkAndSweepConfig.java @@ -0,0 +1,14 @@ +package org.shedlang.compiler.config; + +import org.tomlj.TomlTable; + +import java.util.Optional; + +public record GcMarkAndSweepConfig( + Optional collectInterval +) implements GcConfig { + public static GcMarkAndSweepConfig fromToml(TomlTable table) { + var collectInterval = Optional.ofNullable(table.getLong("collect-interval")); + return new GcMarkAndSweepConfig(collectInterval); + } +} diff --git a/src/main/java/org/shedlang/compiler/config/ProfileConfig.java b/src/main/java/org/shedlang/compiler/config/ProfileConfig.java new file mode 100644 index 00000000..b8854721 --- /dev/null +++ b/src/main/java/org/shedlang/compiler/config/ProfileConfig.java @@ -0,0 +1,18 @@ +package org.shedlang.compiler.config; + +import org.tomlj.TomlTable; + +import java.util.Optional; + +public record ProfileConfig(String name, Optional gc) { + public static ProfileConfig fromToml(TomlTable table) { + var name = table.getString("name"); + var gc = Optional.ofNullable(table.getTable("gc")) + .map(GcConfig::fromToml); + + return new ProfileConfig( + name, + gc + ); + } +} diff --git a/src/main/java/org/shedlang/compiler/config/ProjectConfig.java b/src/main/java/org/shedlang/compiler/config/ProjectConfig.java index 5bd4b178..b7453f70 100644 --- a/src/main/java/org/shedlang/compiler/config/ProjectConfig.java +++ b/src/main/java/org/shedlang/compiler/config/ProjectConfig.java @@ -12,7 +12,8 @@ import java.util.stream.IntStream; public record ProjectConfig( Path root, List bins, - List examples + List examples, + List profiles ) { public static ProjectConfig read(Path projectPath) throws IOException { var tomlParseResult = Toml.parse(projectPath.resolve("shed.toml")); @@ -35,7 +36,8 @@ public record ProjectConfig( return new ProjectConfig( root, binsFromToml(table), - examplesFromToml(table) + examplesFromToml(table), + profilesFromToml(table) ); } @@ -55,6 +57,14 @@ public record ProjectConfig( .toList(); } + public static List profilesFromToml(TomlTable table) { + var profilesArray = table.getArrayOrEmpty(List.of("shed", "profiles")); + + return IntStream.range(0, profilesArray.size()) + .mapToObj(profileIndex -> ProfileConfig.fromToml(profilesArray.getTable(profileIndex))) + .toList(); + } + public Path targetDir() { return root.resolve("target"); } -- cgit v1.2.3