use crate::{Encoding, timeout::format_grpc_timeout};
use std::time::Duration;
pub trait ServiceClient {
fn client(&self) -> &trillium_client::Client;
fn client_mut(&mut self) -> &mut trillium_client::Client;
}
pub trait ServiceClientExt: ServiceClient + Sized {
fn with_outbound_compression(mut self, encoding: Encoding) -> Self {
self.set_outbound_compression(encoding);
self
}
fn set_outbound_compression(&mut self, encoding: Encoding) -> &mut Self {
let headers = self.client_mut().default_headers_mut();
if matches!(encoding, Encoding::Identity) {
headers.remove("grpc-encoding");
} else {
headers.insert("grpc-encoding", encoding.as_grpc_encoding());
}
self
}
fn outbound_compression(&self) -> Encoding {
self.client()
.default_headers()
.get_str("grpc-encoding")
.and_then(Encoding::from_grpc_encoding)
.unwrap_or(Encoding::Identity)
}
fn with_default_timeout(mut self, duration: Duration) -> Self {
self.set_default_timeout(duration);
self
}
fn set_default_timeout(&mut self, duration: Duration) -> &mut Self {
let headers = self.client_mut().default_headers_mut();
if duration.is_zero() {
headers.remove("grpc-timeout");
} else {
headers.insert("grpc-timeout", format_grpc_timeout(duration));
}
self
}
fn default_timeout(&self) -> Option<Duration> {
self.client()
.default_headers()
.get_str("grpc-timeout")
.and_then(crate::timeout::parse_grpc_timeout)
}
}
impl<T: ServiceClient> ServiceClientExt for T {}