Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion settings.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,5 @@ dependencyResolutionManagement {
}
}

include(":grim-bukkit-api")
include(":grim-bukkit-api")
include(":grim-bukkit-internal")
15 changes: 15 additions & 0 deletions src/main/java/ac/grim/grimac/api/config/ConfigManager.java
Original file line number Diff line number Diff line change
@@ -1,13 +1,28 @@
package ac.grim.grimac.api.config;

import ac.grim.grimac.api.common.BasicReloadable;
import ac.grim.grimac.api.config.source.ConfigSource;
import ac.grim.grimac.api.config.source.SourceHandler;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import java.util.List;
import java.util.Map;

public interface ConfigManager extends BasicReloadable {

/**
* Registers a configuration source.
* The Manager looks up the registered Handler for this source type and executes it.
*/
void registerSource(@NotNull ConfigSource source);

/**
* Registers a handler logic for a specific ConfigSource type.
* Example: Registering logic for how to handle Redis sources.
*/
<T extends ConfigSource> void registerHandler(@NotNull Class<T> type, @NotNull SourceHandler<T> handler);

String getStringElse(String key, String otherwise);

@Nullable String getString(String key);
Expand Down
27 changes: 27 additions & 0 deletions src/main/java/ac/grim/grimac/api/config/source/ConfigLoader.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package ac.grim.grimac.api.config.source;

import org.jetbrains.annotations.NotNull;
import java.io.File;
import java.util.Map;

/**
* Exposes the primitive methods to inject configuration data into Grim.
* Passed to SourceHandlers.
*/
public interface ConfigLoader {

/**
* Injects a standard file-based source.
* The system will handle parsing (YAML/JSON) based on extension.
*/
void loadFile(@NotNull String id, @NotNull File file, @NotNull Class<?> resourceOwner);

/**
* Injects raw key-value pairs.
* Use this for Redis, SQL, S3 (parsed), or HTTP sources.
*
* @param id The scope ID.
* @param values The map of flattened keys (e.g. "checks.killaura.enabled") to values.
*/
void loadMap(@NotNull String id, @NotNull Map<String, Object> values);
}
40 changes: 40 additions & 0 deletions src/main/java/ac/grim/grimac/api/config/source/ConfigSource.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package ac.grim.grimac.api.config.source;

import ac.grim.grimac.api.config.source.impl.FileConfigSource;
import ac.grim.grimac.api.config.source.impl.MemoryConfigSource;
import org.jetbrains.annotations.NotNull;

import java.io.File;
import java.util.Map;

/**
* Represents a source of configuration data.
*/
public interface ConfigSource {

@NotNull
String getId();

/**
* Creates a standard file-based configuration source.
*
* @param id The unique ID (matches folder in src/main/resources).
* @param file The file on disk.
* @param resourceOwner The class used to find the default resource.
* @return A new ConfigSource instance.
*/
static ConfigSource file(@NotNull String id, @NotNull File file, @NotNull Class<?> resourceOwner) {
return new FileConfigSource(id, file, resourceOwner);
}

/**
* Creates a memory-based source (good for Redis/SQL bridges).
*
* @param id The unique ID.
* @param values The map of values (e.g. "checks.killaura.enabled" -> true).
* @return A new ConfigSource instance.
*/
static ConfigSource memory(@NotNull String id, @NotNull Map<String, Object> values) {
return new MemoryConfigSource(id, values);
}
}
13 changes: 13 additions & 0 deletions src/main/java/ac/grim/grimac/api/config/source/SourceHandler.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package ac.grim.grimac.api.config.source;

import org.jetbrains.annotations.NotNull;

@FunctionalInterface
public interface SourceHandler<T extends ConfigSource> {
/**
* Handles the loading of a specific source type.
* @param source The configuration data object.
* @param manager The manager instance (use loadFile, loadMap, etc).
*/
void handle(@NotNull T source, @NotNull ConfigLoader manager);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package ac.grim.grimac.api.config.source.impl;

import ac.grim.grimac.api.config.source.ConfigSource;
import org.jetbrains.annotations.NotNull;
import java.io.File;

public final class FileConfigSource implements ConfigSource {
private final String id;
private final File file;
private final Class<?> resourceOwner;

public FileConfigSource(String id, File file, Class<?> resourceOwner) {
this.id = id;
this.file = file;
this.resourceOwner = resourceOwner;
}

@Override public @NotNull String getId() { return id; }
public File getFile() { return file; }
public Class<?> getResourceOwner() { return resourceOwner; }
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package ac.grim.grimac.api.config.source.impl;

import ac.grim.grimac.api.config.source.ConfigSource;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NotNull;

import java.util.Collections;
import java.util.Map;

@ApiStatus.Internal
public final class MemoryConfigSource implements ConfigSource {
private final String id;
private final Map<String, Object> values;

public MemoryConfigSource(String id, Map<String, Object> values) {
this.id = id;
this.values = values;
}

@Override public @NotNull String getId() { return id; }
public Map<String, Object> getValues() { return Collections.unmodifiableMap(values); }
}
Loading