aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2024-03-24 13:45:02 +0000
committerMichael Williamson <mike@zwobble.org>2024-03-24 13:45:02 +0000
commitcb44def5d662e9ec15cf1d97d735c6deb129c302 (patch)
tree6d42fe8107940123a90b39bd761c947f97ca9d3a /src/main/java
parent5741462601505907f25c5b26a2618adf077c05c6 (diff)
Add config for profiles
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/config/GcBumpConfig.java4
-rw-r--r--src/main/java/org/shedlang/compiler/config/GcConfig.java26
-rw-r--r--src/main/java/org/shedlang/compiler/config/GcMarkAndSweepConfig.java14
-rw-r--r--src/main/java/org/shedlang/compiler/config/ProfileConfig.java18
-rw-r--r--src/main/java/org/shedlang/compiler/config/ProjectConfig.java14
5 files changed, 74 insertions, 2 deletions
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<Long> 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<GcConfig> 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<BinConfig> bins,
- List<ExampleConfig> examples
+ List<ExampleConfig> examples,
+ List<ProfileConfig> 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<ProfileConfig> 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");
}