LocalEmulatorSpec.java

package com.cloudforge.core.local;

import java.net.URI;

/**
 * Immutable metadata for a CloudForge-managed local emulator container.
 */
public record LocalEmulatorSpec(
        DeploymentTarget target,
        String containerName,
        String conflictingContainerName,
        String image,
        String healthPath,
        String displayName) {

    public LocalEmulatorSpec {
        if (target == null || target == DeploymentTarget.AWS) {
            throw new IllegalArgumentException("Emulator spec requires MINISTACK or LOCALSTACK target");
        }
    }

    public static LocalEmulatorSpec ministack() {
        return new LocalEmulatorSpec(
            DeploymentTarget.MINISTACK,
            LocalEmulatorDefaults.MINISTACK_CONTAINER,
            LocalEmulatorDefaults.LOCALSTACK_CONTAINER,
            LocalEmulatorDefaults.MINISTACK_IMAGE,
            LocalEmulatorDefaults.MINISTACK_HEALTH_PATH,
            "MiniStack");
    }

    public static LocalEmulatorSpec localstack() {
        return new LocalEmulatorSpec(
            DeploymentTarget.LOCALSTACK,
            LocalEmulatorDefaults.LOCALSTACK_CONTAINER,
            LocalEmulatorDefaults.MINISTACK_CONTAINER,
            LocalEmulatorDefaults.LOCALSTACK_IMAGE,
            LocalEmulatorDefaults.LOCALSTACK_HEALTH_PATH,
            "LocalStack");
    }

    public static LocalEmulatorSpec forTarget(DeploymentTarget target) {
        return switch (target) {
            case MINISTACK -> ministack();
            case LOCALSTACK -> localstack();
            case AWS -> throw new IllegalArgumentException("AWS is not a local emulator target");
        };
    }

    public URI healthEndpoint() {
        return URI.create("http://" + LocalEmulatorDefaults.GATEWAY_HOST + ":"
            + LocalEmulatorDefaults.GATEWAY_PORT + healthPath);
    }

    public URI gatewayEndpoint() {
        return URI.create("http://" + LocalEmulatorDefaults.GATEWAY_HOST + ":"
            + LocalEmulatorDefaults.GATEWAY_PORT);
    }
}