use std::convert::TryFrom;
use std::error::Error;
use std::ffi::CStr;
use std::fmt;
use num_enum::IntoPrimitive;
use crate::bindings;
use crate::helpers;
pub type RDKafka = bindings::rd_kafka_t;
pub type RDKafkaConf = bindings::rd_kafka_conf_t;
pub type RDKafkaMessage = bindings::rd_kafka_message_t;
pub type RDKafkaTopic = bindings::rd_kafka_topic_t;
pub type RDKafkaTopicConf = bindings::rd_kafka_topic_conf_t;
pub type RDKafkaTopicPartition = bindings::rd_kafka_topic_partition_t;
pub type RDKafkaTopicPartitionList = bindings::rd_kafka_topic_partition_list_t;
pub type RDKafkaMetadata = bindings::rd_kafka_metadata_t;
pub type RDKafkaMetadataTopic = bindings::rd_kafka_metadata_topic_t;
pub type RDKafkaMetadataPartition = bindings::rd_kafka_metadata_partition_t;
pub type RDKafkaMetadataBroker = bindings::rd_kafka_metadata_broker_t;
pub type RDKafkaConsumerGroupMetadata = bindings::rd_kafka_consumer_group_metadata_t;
pub type RDKafkaState = bindings::rd_kafka_s;
pub type RDKafkaGroupList = bindings::rd_kafka_group_list;
pub type RDKafkaGroupInfo = bindings::rd_kafka_group_info;
pub type RDKafkaGroupMemberInfo = bindings::rd_kafka_group_member_info;
pub type RDKafkaHeaders = bindings::rd_kafka_headers_t;
pub type RDKafkaQueue = bindings::rd_kafka_queue_t;
pub type RDKafkaNewTopic = bindings::rd_kafka_NewTopic_t;
pub type RDKafkaDeleteTopic = bindings::rd_kafka_DeleteTopic_t;
pub type RDKafkaDeleteGroup = bindings::rd_kafka_DeleteGroup_t;
pub type RDKafkaNewPartitions = bindings::rd_kafka_NewPartitions_t;
pub type RDKafkaDeleteRecords = bindings::rd_kafka_DeleteRecords_t;
pub type RDKafkaConfigResource = bindings::rd_kafka_ConfigResource_t;
pub type RDKafkaEvent = bindings::rd_kafka_event_t;
pub type RDKafkaAdminOptions = bindings::rd_kafka_AdminOptions_t;
pub type RDKafkaTopicResult = bindings::rd_kafka_topic_result_t;
pub type RDKafkaGroupResult = bindings::rd_kafka_group_result_t;
pub type RDKafkaMockCluster = bindings::rd_kafka_mock_cluster_t;
pub use bindings::rd_kafka_type_t as RDKafkaType;
pub use bindings::rd_kafka_conf_res_t as RDKafkaConfRes;
pub use bindings::rd_kafka_resp_err_t as RDKafkaRespErr;
pub use bindings::rd_kafka_admin_op_t as RDKafkaAdminOp;
pub use bindings::rd_kafka_ResourceType_t as RDKafkaResourceType;
pub use bindings::rd_kafka_ConfigSource_t as RDKafkaConfigSource;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[non_exhaustive]
pub enum RDKafkaErrorCode {
#[doc(hidden)]
Begin = -200,
BadMessage = -199,
BadCompression = -198,
BrokerDestroy = -197,
Fail = -196,
BrokerTransportFailure = -195,
CriticalSystemResource = -194,
Resolve = -193,
MessageTimedOut = -192,
PartitionEOF = -191,
UnknownPartition = -190,
FileSystem = -189,
UnknownTopic = -188,
AllBrokersDown = -187,
InvalidArgument = -186,
OperationTimedOut = -185,
QueueFull = -184,
ISRInsufficient = -183,
NodeUpdate = -182,
SSL = -181,
WaitingForCoordinator = -180,
UnknownGroup = -179,
InProgress = -178,
PreviousInProgress = -177,
ExistingSubscription = -176,
AssignPartitions = -175,
RevokePartitions = -174,
Conflict = -173,
State = -172,
UnknownProtocol = -171,
NotImplemented = -170,
Authentication = -169,
NoOffset = -168,
Outdated = -167,
TimedOutQueue = -166,
UnsupportedFeature = -165,
WaitCache = -164,
Interrupted = -163,
KeySerialization = -162,
ValueSerialization = -161,
KeyDeserialization = -160,
ValueDeserialization = -159,
Partial = -158,
ReadOnly = -157,
NoEnt = -156,
Underflow = -155,
InvalidType = -154,
Retry = -153,
PurgeQueue = -152,
PurgeInflight = -151,
Fatal = -150,
Inconsistent = -149,
GaplessGuarantee = -148,
PollExceeded = -147,
UnknownBroker = -146,
NotConfigured = -145,
Fenced = -144,
Application = -143,
AssignmentLost = -142,
Noop = -141,
AutoOffsetReset = -140,
LogTruncation = -139,
InvalidDifferentRecord = -138,
DestroyBroker = -137,
#[doc(hidden)]
End = -100,
Unknown = -1,
NoError = 0,
OffsetOutOfRange = 1,
InvalidMessage = 2,
UnknownTopicOrPartition = 3,
InvalidMessageSize = 4,
LeaderNotAvailable = 5,
NotLeaderForPartition = 6,
RequestTimedOut = 7,
BrokerNotAvailable = 8,
ReplicaNotAvailable = 9,
MessageSizeTooLarge = 10,
StaleControllerEpoch = 11,
OffsetMetadataTooLarge = 12,
NetworkException = 13,
CoordinatorLoadInProgress = 14,
CoordinatorNotAvailable = 15,
NotCoordinator = 16,
InvalidTopic = 17,
MessageBatchTooLarge = 18,
NotEnoughReplicas = 19,
NotEnoughReplicasAfterAppend = 20,
InvalidRequiredAcks = 21,
IllegalGeneration = 22,
InconsistentGroupProtocol = 23,
InvalidGroupId = 24,
UnknownMemberId = 25,
InvalidSessionTimeout = 26,
RebalanceInProgress = 27,
InvalidCommitOffsetSize = 28,
TopicAuthorizationFailed = 29,
GroupAuthorizationFailed = 30,
ClusterAuthorizationFailed = 31,
InvalidTimestamp = 32,
UnsupportedSASLMechanism = 33,
IllegalSASLState = 34,
UnsupportedVersion = 35,
TopicAlreadyExists = 36,
InvalidPartitions = 37,
InvalidReplicationFactor = 38,
InvalidReplicaAssignment = 39,
InvalidConfig = 40,
NotController = 41,
InvalidRequest = 42,
UnsupportedForMessageFormat = 43,
PolicyViolation = 44,
OutOfOrderSequenceNumber = 45,
DuplicateSequenceNumber = 46,
InvalidProducerEpoch = 47,
InvalidTransactionalState = 48,
InvalidProducerIdMapping = 49,
InvalidTransactionTimeout = 50,
ConcurrentTransactions = 51,
TransactionCoordinatorFenced = 52,
TransactionalIdAuthorizationFailed = 53,
SecurityDisabled = 54,
OperationNotAttempted = 55,
KafkaStorageError = 56,
LogDirNotFound = 57,
SaslAuthenticationFailed = 58,
UnknownProducerId = 59,
ReassignmentInProgress = 60,
DelegationTokenAuthDisabled = 61,
DelegationTokenNotFound = 62,
DelegationTokenOwnerMismatch = 63,
DelegationTokenRequestNotAllowed = 64,
DelegationTokenAuthorizationFailed = 65,
DelegationTokenExpired = 66,
InvalidPrincipalType = 67,
NonEmptyGroup = 68,
GroupIdNotFound = 69,
FetchSessionIdNotFound = 70,
InvalidFetchSessionEpoch = 71,
ListenerNotFound = 72,
TopicDeletionDisabled = 73,
FencedLeaderEpoch = 74,
UnknownLeaderEpoch = 75,
UnsupportedCompressionType = 76,
StaleBrokerEpoch = 77,
OffsetNotAvailable = 78,
MemberIdRequired = 79,
PreferredLeaderNotAvailable = 80,
GroupMaxSizeReached = 81,
FencedInstanceId = 82,
EligibleLeadersNotAvailable = 83,
ElectionNotNeeded = 84,
NoReassignmentInProgress = 85,
GroupSubscribedToTopic = 86,
InvalidRecord = 87,
UnstableOffsetCommit = 88,
ThrottlingQuotaExceeded = 89,
ProducerFenced = 90,
ResourceNotFound = 91,
DuplicateResource = 92,
UnacceptableCredential = 93,
InconsistentVoterSet = 94,
InvalidUpdateVersion = 95,
FeatureUpdateFailed = 96,
PrincipalDeserializationFailure = 97,
UnknownTopicId = 100,
FencedMemberEpoch = 110,
UnreleasedInstanceId = 111,
UnsupportedAssignor = 112,
StaleMemberEpoch = 113,
UnknownSubscriptionId = 117,
TelemetryTooLarge = 118,
RebootstrapRequired = 129,
#[doc(hidden)]
EndAll,
}
impl From<RDKafkaRespErr> for RDKafkaErrorCode {
fn from(err: RDKafkaRespErr) -> RDKafkaErrorCode {
helpers::rd_kafka_resp_err_t_to_rdkafka_error(err)
}
}
impl fmt::Display for RDKafkaErrorCode {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
let description = match RDKafkaRespErr::try_from(*self as i32) {
Ok(err) => {
let cstr = unsafe { bindings::rd_kafka_err2str(err) };
unsafe { CStr::from_ptr(cstr) }
.to_string_lossy()
.into_owned()
}
Err(_) => "Unknown error".to_owned(),
};
write!(f, "{:?} ({})", self, description)
}
}
impl Error for RDKafkaErrorCode {}
#[derive(Debug, Clone, Copy, PartialEq, Eq, IntoPrimitive)]
#[repr(i16)]
#[non_exhaustive]
pub enum RDKafkaApiKey {
Produce = 0,
Fetch = 1,
ListOffsets = 2,
Metadata = 3,
LeaderAndIsr = 4,
StopReplica = 5,
UpdateMetadata = 6,
ControlledShutdown = 7,
OffsetCommit = 8,
OffsetFetch = 9,
FindCoordinator = 10,
JoinGroup = 11,
Heartbeat = 12,
LeaveGroup = 13,
SyncGroup = 14,
DescribeGroups = 15,
ListGroups = 16,
SaslHandshake = 17,
ApiVersion = 18,
CreateTopics = 19,
DeleteTopics = 20,
DeleteRecords = 21,
InitProducerId = 22,
OffsetForLeaderEpoch = 23,
AddPartitionsToTxn = 24,
AddOffsetsToTxn = 25,
EndTxn = 26,
WriteTxnMarkers = 27,
TxnOffsetCommit = 28,
DescribeAcls = 29,
CreateAcls = 30,
DeleteAcls = 31,
DescribeConfigs = 32,
AlterConfigs = 33,
AlterReplicaLogDirs = 34,
DescribeLogDirs = 35,
SaslAuthenticate = 36,
CreatePartitions = 37,
CreateDelegationToken = 38,
RenewDelegationToken = 39,
ExpireDelegationToken = 40,
DescribeDelegationToken = 41,
DeleteGroups = 42,
ElectLeaders = 43,
IncrementalAlterConfigs = 44,
AlterPartitionReassignments = 45,
ListPartitionReassignments = 46,
OffsetDelete = 47,
DescribeClientQuotas = 48,
AlterClientQuotas = 49,
DescribeUserScramCredentials = 50,
AlterUserScramCredentials = 51,
Vote = 52,
BeginQuorumEpoch = 53,
EndQuorumEpoch = 54,
DescribeQuorum = 55,
AlterIsr = 56,
UpdateFeatures = 57,
Envelope = 58,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_display_error() {
let error: RDKafkaErrorCode = RDKafkaRespErr::RD_KAFKA_RESP_ERR__PARTITION_EOF.into();
assert_eq!(
"PartitionEOF (Broker: No more messages)",
format!("{}", error)
);
assert_eq!("PartitionEOF", format!("{:?}", error));
}
}