use std::sync::Arc;
use std::time::Duration;
#[derive(Clone, Debug, Eq, PartialEq)]
#[non_exhaustive]
pub struct ConnectionEstablishmentMetadata {
inner: Arc<ConnectionEstablishmentMetadataInner>,
}
#[derive(Debug, Eq, PartialEq)]
struct ConnectionEstablishmentMetadataInner {
total_duration: Duration,
transport_duration: Duration,
protocol_handshake_duration: Option<Duration>,
dns_duration: Option<Duration>,
socket_connect_duration: Option<Duration>,
proxy_duration: Option<Duration>,
tls_duration: Option<Duration>,
}
impl ConnectionEstablishmentMetadata {
pub fn builder() -> ConnectionEstablishmentMetadataBuilder {
ConnectionEstablishmentMetadataBuilder::new()
}
pub fn total_duration(&self) -> Duration {
self.inner.total_duration
}
pub fn transport_duration(&self) -> Duration {
self.inner.transport_duration
}
pub fn protocol_handshake_duration(&self) -> Option<Duration> {
self.inner.protocol_handshake_duration
}
pub fn dns_duration(&self) -> Option<Duration> {
self.inner.dns_duration
}
pub fn socket_connect_duration(&self) -> Option<Duration> {
self.inner.socket_connect_duration
}
pub fn proxy_duration(&self) -> Option<Duration> {
self.inner.proxy_duration
}
pub fn tls_duration(&self) -> Option<Duration> {
self.inner.tls_duration
}
}
#[derive(Clone, Debug, Default)]
pub struct ConnectionEstablishmentMetadataBuilder {
total_duration: Option<Duration>,
transport_duration: Option<Duration>,
protocol_handshake_duration: Option<Duration>,
dns_duration: Option<Duration>,
socket_connect_duration: Option<Duration>,
proxy_duration: Option<Duration>,
tls_duration: Option<Duration>,
}
impl ConnectionEstablishmentMetadataBuilder {
pub fn new() -> Self {
Self::default()
}
pub fn total_duration(mut self, duration: Duration) -> Self {
self.set_total_duration(Some(duration));
self
}
pub fn set_total_duration(&mut self, duration: Option<Duration>) -> &mut Self {
self.total_duration = duration;
self
}
pub fn transport_duration(mut self, duration: Duration) -> Self {
self.set_transport_duration(Some(duration));
self
}
pub fn set_transport_duration(&mut self, duration: Option<Duration>) -> &mut Self {
self.transport_duration = duration;
self
}
pub fn protocol_handshake_duration(mut self, duration: Duration) -> Self {
self.set_protocol_handshake_duration(Some(duration));
self
}
pub fn set_protocol_handshake_duration(&mut self, duration: Option<Duration>) -> &mut Self {
self.protocol_handshake_duration = duration;
self
}
pub fn dns_duration(mut self, duration: Duration) -> Self {
self.set_dns_duration(Some(duration));
self
}
pub fn set_dns_duration(&mut self, duration: Option<Duration>) -> &mut Self {
self.dns_duration = duration;
self
}
pub fn socket_connect_duration(mut self, duration: Duration) -> Self {
self.set_socket_connect_duration(Some(duration));
self
}
pub fn set_socket_connect_duration(&mut self, duration: Option<Duration>) -> &mut Self {
self.socket_connect_duration = duration;
self
}
pub fn proxy_duration(mut self, duration: Duration) -> Self {
self.set_proxy_duration(Some(duration));
self
}
pub fn set_proxy_duration(&mut self, duration: Option<Duration>) -> &mut Self {
self.proxy_duration = duration;
self
}
pub fn tls_duration(mut self, duration: Duration) -> Self {
self.set_tls_duration(Some(duration));
self
}
pub fn set_tls_duration(&mut self, duration: Option<Duration>) -> &mut Self {
self.tls_duration = duration;
self
}
pub fn build(self) -> ConnectionEstablishmentMetadata {
ConnectionEstablishmentMetadata {
inner: Arc::new(ConnectionEstablishmentMetadataInner {
total_duration: self
.total_duration
.expect("total_duration is required for connection establishment metadata"),
transport_duration: self
.transport_duration
.expect("transport_duration is required for connection establishment metadata"),
protocol_handshake_duration: self.protocol_handshake_duration,
dns_duration: self.dns_duration,
socket_connect_duration: self.socket_connect_duration,
proxy_duration: self.proxy_duration,
tls_duration: self.tls_duration,
}),
}
}
}