use std::future::Future;
use std::io;
use std::time::Duration;
pub mod admin;
pub mod builder;
pub mod cluster;
pub mod consumer;
pub mod group;
mod join;
pub mod producer;
pub mod sasl;
mod timeout;
pub use admin::{Admin, BrokerInfo, NewTopic};
pub use builder::{ConsumerBuilder, ProducerBuilder, StartOffset};
pub use cluster::Cluster;
pub use consumer::{Consumer, ConsumerRecords, RebalanceListener, RecordRef, EARLIEST, LATEST};
pub use group::{ClassicProtocol, GroupMetadata, GroupProtocol, Membership};
pub use producer::{Producer, ProducerRecord};
pub use sasl::{Credentials, SaslMechanism};
use barnabas_core::{Disposition, ErrorCode};
pub trait Transport: 'static {
type Stream: 'static;
fn connect(&self, addr: &str) -> impl Future<Output = io::Result<Self::Stream>>;
fn read(stream: &mut Self::Stream, buf: &mut [u8]) -> impl Future<Output = io::Result<usize>>;
fn write_all(stream: &mut Self::Stream, buf: &[u8]) -> impl Future<Output = io::Result<()>>;
fn sleep(dur: Duration) -> impl Future<Output = ()>;
}
#[derive(Debug, thiserror::Error)]
pub enum Error {
#[error("core: {0}")]
Core(#[from] barnabas_core::Error),
#[error("io: {0}")]
Io(#[from] io::Error),
#[error("connect {addr}: {source}")]
Connect {
addr: String,
#[source]
source: io::Error,
},
#[error("{op} failed with error code {code} ({disposition:?})")]
Broker {
op: &'static str,
code: i16,
disposition: Disposition,
},
#[error("{topic}-{partition} has no leader")]
NoLeader { topic: String, partition: i32 },
#[error("producer: {0}")]
Producer(#[from] barnabas_core::producer::ProducerError),
#[error("{op:?} to {addr} timed out")]
Timeout {
op: kafka_protocol::messages::ApiKey,
addr: String,
},
#[error("sasl: {0}")]
Sasl(String),
#[error("the broker's response contained no {0}")]
Missing(&'static str),
#[error("{op:?} on {addr}: {in_flight} request(s) already in flight on this connection")]
ConnectionBusy {
op: kafka_protocol::messages::ApiKey,
addr: String,
in_flight: usize,
},
}
pub type Result<T> = std::result::Result<T, Error>;
pub(crate) fn check(op: &'static str, code: i16) -> Result<()> {
let code = ErrorCode(code);
if code.is_ok() {
return Ok(());
}
Err(Error::Broker {
op,
code: code.0,
disposition: code.disposition(),
})
}