use core::fmt;
use cloud_sdk::Method;
use cloud_sdk::operation::{OperationMetadata, PreparedRequest, ProviderService, ResponsePolicy};
use cloud_sdk::transport::HeaderSensitivity;
#[derive(Clone, Copy, Eq, PartialEq)]
pub struct PreparedRequestRecord<'endpoint> {
method: Method,
target_len: usize,
body_len: usize,
has_request_content_type: bool,
header_count: usize,
sensitive_header_count: usize,
service: ProviderService<'endpoint>,
metadata: OperationMetadata,
response_policy: ResponsePolicy,
}
impl<'endpoint> PreparedRequestRecord<'endpoint> {
#[must_use]
pub fn capture(prepared: PreparedRequest<'endpoint>) -> Self {
let request = prepared.transport_request();
Self {
method: request.method(),
target_len: request.target().len(),
body_len: request.body().len(),
has_request_content_type: request.headers().get("content-type").is_some(),
header_count: request.headers().as_slice().len(),
sensitive_header_count: request
.headers()
.as_slice()
.iter()
.filter(|header| matches!(header.sensitivity(), HeaderSensitivity::Sensitive))
.count(),
service: prepared.service(),
metadata: prepared.metadata(),
response_policy: prepared.response_policy(),
}
}
#[must_use]
pub const fn method(self) -> Method {
self.method
}
#[must_use]
pub const fn target_len(self) -> usize {
self.target_len
}
#[must_use]
pub const fn body_len(self) -> usize {
self.body_len
}
#[must_use]
pub const fn has_request_content_type(self) -> bool {
self.has_request_content_type
}
#[must_use]
pub const fn header_count(self) -> usize {
self.header_count
}
#[must_use]
pub const fn sensitive_header_count(self) -> usize {
self.sensitive_header_count
}
#[must_use]
pub const fn service(self) -> ProviderService<'endpoint> {
self.service
}
#[must_use]
pub const fn metadata(self) -> OperationMetadata {
self.metadata
}
#[must_use]
pub const fn response_policy(self) -> ResponsePolicy {
self.response_policy
}
}
impl fmt::Debug for PreparedRequestRecord<'_> {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
formatter
.debug_struct("PreparedRequestRecord")
.field("method", &self.method)
.field("target_len", &self.target_len)
.field("target", &"[redacted]")
.field("body_len", &self.body_len)
.field("body", &"[redacted]")
.field("has_request_content_type", &self.has_request_content_type)
.field("header_count", &self.header_count)
.field("sensitive_header_count", &self.sensitive_header_count)
.field("service", &self.service)
.field("metadata", &self.metadata)
.field("response_policy", &self.response_policy)
.finish()
}
}