// Broker error codes from the Kafka 4.3 protocol error table
// (kafka.apache.org/43 protocol guide), cross-checked against
// Errors.java. Generated mechanically from the published 4.3 table;
// codes beyond it fall back to UNKNOWN, so later additions are safe.

///|
/// An error code reported by a broker in a response. `message` carries
/// call-site context (which request, which topic/partition) on top of
/// the protocol-level code.
pub(all) suberror BrokerError {
  BrokerError(Int, String)
}

///|
/// SASL negotiation or authentication failure. The connection is closed.
pub(all) suberror SaslError {
  SaslError(String)
}

///|
/// Transport-level failure. The affected connection has been closed when
/// either variant is raised; callers reconnect rather than retry in place.
pub(all) suberror TransportError {
  ConnectionClosed(String)
  RequestTimeout(String)
}

///|
/// Protocol name for the error code, e.g. "OFFSET_OUT_OF_RANGE".
pub fn BrokerError::name(self : BrokerError) -> String {
  let BrokerError(code, _) = self
  error_name(code)
}

///|
/// Whether the protocol marks this error as retriable.
pub fn BrokerError::is_retriable(self : BrokerError) -> Bool {
  let BrokerError(code, _) = self
  error_retriable(code)
}

///|
/// Protocol name for a broker error code; unknown codes render as
/// "UNKNOWN(code)".
pub fn error_name(code : Int) -> String {
  match error_codes.get(code) {
    Some((name, _)) => name
    None => "UNKNOWN(\{code})"
  }
}

///|
/// Whether the protocol marks the error code as retriable; unknown
/// codes are treated as not retriable.
pub fn error_retriable(code : Int) -> Bool {
  match error_codes.get(code) {
    Some((_, retriable)) => retriable
    None => false
  }
}

///|
let error_codes : Map[Int, (String, Bool)] = Map([
  (-1, ("UNKNOWN_SERVER_ERROR", false)),
  (0, ("NONE", false)),
  (1, ("OFFSET_OUT_OF_RANGE", false)),
  (2, ("CORRUPT_MESSAGE", true)),
  (3, ("UNKNOWN_TOPIC_OR_PARTITION", true)),
  (4, ("INVALID_FETCH_SIZE", false)),
  (5, ("LEADER_NOT_AVAILABLE", true)),
  (6, ("NOT_LEADER_OR_FOLLOWER", true)),
  (7, ("REQUEST_TIMED_OUT", true)),
  (8, ("BROKER_NOT_AVAILABLE", false)),
  (9, ("REPLICA_NOT_AVAILABLE", true)),
  (10, ("MESSAGE_TOO_LARGE", false)),
  (11, ("STALE_CONTROLLER_EPOCH", false)),
  (12, ("OFFSET_METADATA_TOO_LARGE", false)),
  (13, ("NETWORK_EXCEPTION", true)),
  (14, ("COORDINATOR_LOAD_IN_PROGRESS", true)),
  (15, ("COORDINATOR_NOT_AVAILABLE", true)),
  (16, ("NOT_COORDINATOR", true)),
  (17, ("INVALID_TOPIC_EXCEPTION", false)),
  (18, ("RECORD_LIST_TOO_LARGE", false)),
  (19, ("NOT_ENOUGH_REPLICAS", true)),
  (20, ("NOT_ENOUGH_REPLICAS_AFTER_APPEND", true)),
  (21, ("INVALID_REQUIRED_ACKS", false)),
  (22, ("ILLEGAL_GENERATION", false)),
  (23, ("INCONSISTENT_GROUP_PROTOCOL", false)),
  (24, ("INVALID_GROUP_ID", false)),
  (25, ("UNKNOWN_MEMBER_ID", false)),
  (26, ("INVALID_SESSION_TIMEOUT", false)),
  (27, ("REBALANCE_IN_PROGRESS", false)),
  (28, ("INVALID_COMMIT_OFFSET_SIZE", false)),
  (29, ("TOPIC_AUTHORIZATION_FAILED", false)),
  (30, ("GROUP_AUTHORIZATION_FAILED", false)),
  (31, ("CLUSTER_AUTHORIZATION_FAILED", false)),
  (32, ("INVALID_TIMESTAMP", false)),
  (33, ("UNSUPPORTED_SASL_MECHANISM", false)),
  (34, ("ILLEGAL_SASL_STATE", false)),
  (35, ("UNSUPPORTED_VERSION", false)),
  (36, ("TOPIC_ALREADY_EXISTS", false)),
  (37, ("INVALID_PARTITIONS", false)),
  (38, ("INVALID_REPLICATION_FACTOR", false)),
  (39, ("INVALID_REPLICA_ASSIGNMENT", false)),
  (40, ("INVALID_CONFIG", false)),
  (41, ("NOT_CONTROLLER", true)),
  (42, ("INVALID_REQUEST", false)),
  (43, ("UNSUPPORTED_FOR_MESSAGE_FORMAT", false)),
  (44, ("POLICY_VIOLATION", false)),
  (45, ("OUT_OF_ORDER_SEQUENCE_NUMBER", false)),
  (46, ("DUPLICATE_SEQUENCE_NUMBER", false)),
  (47, ("INVALID_PRODUCER_EPOCH", false)),
  (48, ("INVALID_TXN_STATE", false)),
  (49, ("INVALID_PRODUCER_ID_MAPPING", false)),
  (50, ("INVALID_TRANSACTION_TIMEOUT", false)),
  (51, ("CONCURRENT_TRANSACTIONS", true)),
  (52, ("TRANSACTION_COORDINATOR_FENCED", false)),
  (53, ("TRANSACTIONAL_ID_AUTHORIZATION_FAILED", false)),
  (54, ("SECURITY_DISABLED", false)),
  (55, ("OPERATION_NOT_ATTEMPTED", false)),
  (56, ("KAFKA_STORAGE_ERROR", true)),
  (57, ("LOG_DIR_NOT_FOUND", false)),
  (58, ("SASL_AUTHENTICATION_FAILED", false)),
  (59, ("UNKNOWN_PRODUCER_ID", false)),
  (60, ("REASSIGNMENT_IN_PROGRESS", false)),
  (61, ("DELEGATION_TOKEN_AUTH_DISABLED", false)),
  (62, ("DELEGATION_TOKEN_NOT_FOUND", false)),
  (63, ("DELEGATION_TOKEN_OWNER_MISMATCH", false)),
  (64, ("DELEGATION_TOKEN_REQUEST_NOT_ALLOWED", false)),
  (65, ("DELEGATION_TOKEN_AUTHORIZATION_FAILED", false)),
  (66, ("DELEGATION_TOKEN_EXPIRED", false)),
  (67, ("INVALID_PRINCIPAL_TYPE", false)),
  (68, ("NON_EMPTY_GROUP", false)),
  (69, ("GROUP_ID_NOT_FOUND", false)),
  (70, ("FETCH_SESSION_ID_NOT_FOUND", true)),
  (71, ("INVALID_FETCH_SESSION_EPOCH", true)),
  (72, ("LISTENER_NOT_FOUND", true)),
  (73, ("TOPIC_DELETION_DISABLED", false)),
  (74, ("FENCED_LEADER_EPOCH", true)),
  (75, ("UNKNOWN_LEADER_EPOCH", true)),
  (76, ("UNSUPPORTED_COMPRESSION_TYPE", false)),
  (77, ("STALE_BROKER_EPOCH", false)),
  (78, ("OFFSET_NOT_AVAILABLE", true)),
  (79, ("MEMBER_ID_REQUIRED", false)),
  (80, ("PREFERRED_LEADER_NOT_AVAILABLE", true)),
  (81, ("GROUP_MAX_SIZE_REACHED", false)),
  (82, ("FENCED_INSTANCE_ID", false)),
  (83, ("ELIGIBLE_LEADERS_NOT_AVAILABLE", true)),
  (84, ("ELECTION_NOT_NEEDED", true)),
  (85, ("NO_REASSIGNMENT_IN_PROGRESS", false)),
  (86, ("GROUP_SUBSCRIBED_TO_TOPIC", false)),
  (87, ("INVALID_RECORD", false)),
  (88, ("UNSTABLE_OFFSET_COMMIT", true)),
  (89, ("THROTTLING_QUOTA_EXCEEDED", true)),
  (90, ("PRODUCER_FENCED", false)),
  (91, ("RESOURCE_NOT_FOUND", false)),
  (92, ("DUPLICATE_RESOURCE", false)),
  (93, ("UNACCEPTABLE_CREDENTIAL", false)),
  (94, ("INCONSISTENT_VOTER_SET", false)),
  (95, ("INVALID_UPDATE_VERSION", false)),
  (96, ("FEATURE_UPDATE_FAILED", false)),
  (97, ("PRINCIPAL_DESERIALIZATION_FAILURE", false)),
  (98, ("SNAPSHOT_NOT_FOUND", false)),
  (99, ("POSITION_OUT_OF_RANGE", false)),
  (100, ("UNKNOWN_TOPIC_ID", true)),
  (101, ("DUPLICATE_BROKER_REGISTRATION", false)),
  (102, ("BROKER_ID_NOT_REGISTERED", false)),
  (103, ("INCONSISTENT_TOPIC_ID", true)),
  (104, ("INCONSISTENT_CLUSTER_ID", false)),
  (105, ("TRANSACTIONAL_ID_NOT_FOUND", false)),
  (106, ("FETCH_SESSION_TOPIC_ID_ERROR", true)),
  (107, ("INELIGIBLE_REPLICA", false)),
  (108, ("NEW_LEADER_ELECTED", false)),
  (109, ("OFFSET_MOVED_TO_TIERED_STORAGE", false)),
  (110, ("FENCED_MEMBER_EPOCH", false)),
  (111, ("UNRELEASED_INSTANCE_ID", false)),
  (112, ("UNSUPPORTED_ASSIGNOR", false)),
  (113, ("STALE_MEMBER_EPOCH", false)),
  (114, ("MISMATCHED_ENDPOINT_TYPE", false)),
  (115, ("UNSUPPORTED_ENDPOINT_TYPE", false)),
  (116, ("UNKNOWN_CONTROLLER_ID", false)),
  (117, ("UNKNOWN_SUBSCRIPTION_ID", false)),
  (118, ("TELEMETRY_TOO_LARGE", false)),
  (119, ("INVALID_REGISTRATION", false)),
  (120, ("TRANSACTION_ABORTABLE", false)),
  (121, ("INVALID_RECORD_STATE", false)),
  (122, ("SHARE_SESSION_NOT_FOUND", true)),
  (123, ("INVALID_SHARE_SESSION_EPOCH", true)),
  (124, ("FENCED_STATE_EPOCH", false)),
  (125, ("INVALID_VOTER_KEY", false)),
  (126, ("DUPLICATE_VOTER", false)),
  (127, ("VOTER_NOT_FOUND", false)),
  (128, ("INVALID_REGULAR_EXPRESSION", false)),
  (129, ("REBOOTSTRAP_REQUIRED", false)),
  (130, ("STREAMS_INVALID_TOPOLOGY", false)),
  (131, ("STREAMS_INVALID_TOPOLOGY_EPOCH", false)),
  (132, ("STREAMS_TOPOLOGY_FENCED", false)),
  (133, ("SHARE_SESSION_LIMIT_REACHED", true)),
])