ErrorKind.java

package com.surrealdb;

import java.util.HashMap;
import java.util.Map;

/**
 * Machine-readable error kind, aligned with the SurrealDB Rust SDK's {@code ErrorDetails} enum.
 *
 * <p>Returned by {@link ServerException#getKindEnum()}. Use this for type-safe matching instead
 * of {@link ServerException#getKind()} when the kind is known. For unknown (future) kinds,
 * {@link #UNKNOWN} is used and the raw string is available via {@link ServerException#getKind()}.
 */
public enum ErrorKind {

	VALIDATION("Validation"),
	CONFIGURATION("Configuration"),
	THROWN("Thrown"),
	QUERY("Query"),
	SERIALIZATION("Serialization"),
	NOT_ALLOWED("NotAllowed"),
	NOT_FOUND("NotFound"),
	ALREADY_EXISTS("AlreadyExists"),
	CONNECTION("Connection"),
	INTERNAL("Internal"),
	/** Unknown kind from a newer server; raw string is in {@link ServerException#getKind()}. */
	UNKNOWN(null);

	private static final Map<String, ErrorKind> LOOKUP;

	static {
		LOOKUP = new HashMap<>();
		for (ErrorKind k : values()) {
			if (k.raw != null) {
				LOOKUP.put(k.raw, k);
			}
		}
	}

	private final String raw;

	ErrorKind(String raw) {
		this.raw = raw;
	}

	/**
	 * Resolves a kind string from the wire to an enum constant.
	 * Unknown strings return {@link #UNKNOWN}.
	 *
	 * @param kind the kind string (e.g. from the server)
	 * @return the matching enum constant, or {@link #UNKNOWN}
	 */
	public static ErrorKind fromString(String kind) {
		if (kind == null) {
			return UNKNOWN;
		}
		return LOOKUP.getOrDefault(kind, UNKNOWN);
	}

	/**
	 * Returns the wire string for this kind, or {@code null} for {@link #UNKNOWN}.
	 */
	public String getRaw() {
		return raw;
	}
}