use super::session::Session;
use super::transport::Transport;
use std::sync::Arc;
const MIB: i64 = 1024 * 1024;
pub struct StreamingPull {
pub(super) inner: Arc<Transport>,
pub(super) subscription: String,
pub(super) client_id: String,
pub(super) grpc_subchannel_count: usize,
pub(super) ack_deadline_seconds: i32,
pub(super) max_outstanding_messages: i64,
pub(super) max_outstanding_bytes: i64,
}
impl StreamingPull {
pub(super) fn new(
inner: Arc<Transport>,
subscription: String,
client_id: String,
grpc_subchannel_count: usize,
) -> Self {
Self {
inner,
subscription,
client_id,
grpc_subchannel_count,
ack_deadline_seconds: 10,
max_outstanding_messages: 1000,
max_outstanding_bytes: 100 * MIB,
}
}
pub fn start(self) -> Session {
Session::new(self)
}
pub fn set_ack_deadline_seconds<T: Into<i32>>(mut self, v: T) -> Self {
self.ack_deadline_seconds = v.into();
self
}
pub fn set_max_outstanding_messages<T: Into<i64>>(mut self, v: T) -> Self {
self.max_outstanding_messages = v.into();
self
}
pub fn set_max_outstanding_bytes<T: Into<i64>>(mut self, v: T) -> Self {
self.max_outstanding_bytes = v.into();
self
}
}
#[cfg(test)]
mod tests {
use super::*;
use gaxi::options::ClientConfig;
use google_cloud_auth::credentials::anonymous::Builder as Anonymous;
const KIB: i64 = 1024;
async fn test_inner() -> anyhow::Result<Arc<Transport>> {
let mut config = ClientConfig::default();
config.cred = Some(Anonymous::new().build());
let transport = Transport::new(config).await?;
Ok(Arc::new(transport))
}
#[tokio::test]
async fn reasonable_defaults() -> anyhow::Result<()> {
let builder = StreamingPull::new(
test_inner().await?,
"projects/my-project/subscriptions/my-subscription".to_string(),
"client-id".to_string(),
1_usize,
);
assert_eq!(
builder.subscription,
"projects/my-project/subscriptions/my-subscription"
);
assert_eq!(builder.grpc_subchannel_count, 1);
assert_eq!(builder.ack_deadline_seconds, 10);
assert!(
100_000 > builder.max_outstanding_messages && builder.max_outstanding_messages > 100,
"max_outstanding_messages={}",
builder.max_outstanding_messages
);
assert!(
builder.max_outstanding_bytes > 100 * KIB,
"max_outstanding_bytes={}",
builder.max_outstanding_bytes
);
Ok(())
}
#[tokio::test]
async fn options() -> anyhow::Result<()> {
let builder = StreamingPull::new(
test_inner().await?,
"projects/my-project/subscriptions/my-subscription".to_string(),
"client-id".to_string(),
1_usize,
)
.set_ack_deadline_seconds(20)
.set_max_outstanding_messages(12345)
.set_max_outstanding_bytes(6789 * KIB);
assert_eq!(
builder.subscription,
"projects/my-project/subscriptions/my-subscription"
);
assert_eq!(builder.grpc_subchannel_count, 1);
assert_eq!(builder.ack_deadline_seconds, 20);
assert_eq!(builder.max_outstanding_messages, 12345);
assert_eq!(builder.max_outstanding_bytes, 6789 * KIB);
Ok(())
}
}