package com.battery.device.api.registry; import java.time.ZoneId; import java.util.Locale; import java.util.Objects; import com.battery.device.api.model.AdapterCapabilities; /** 设备适配器实例的运行时配置。 */ public record AdapterInstanceConfig( String adapterCode, String adapterType, String host, int port, int pollIntervalMs, String timezoneId, boolean enabled, AdapterCapabilities capabilities) { public AdapterInstanceConfig { adapterCode = requireText(adapterCode, "adapterCode"); adapterType = requireText(adapterType, "adapterType").toUpperCase(Locale.ROOT); host = requireText(host, "host"); timezoneId = requireText(timezoneId, "timezoneId"); capabilities = Objects.requireNonNull(capabilities, "capabilities"); if (port < 1 || port > 65535) throw new IllegalArgumentException("port must be between 1 and 65535"); if (pollIntervalMs < 1) throw new IllegalArgumentException("pollIntervalMs must be positive"); ZoneId.of(timezoneId); if (!capabilities.discovery() || capabilities.control()) throw new IllegalArgumentException("MVP adapter must support discovery and remain read-only"); } private static String requireText(String value, String field) { String normalized = Objects.requireNonNull(value, field).trim(); if (normalized.isEmpty()) throw new IllegalArgumentException(field + " must not be blank"); return normalized; } }