use std::fmt;
use std::time::Duration;
use crate::BuildError;
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum ResourcePolicyField {
MaxInboundRequests,
MaxOutboundMessages,
MaxOutboundBytes,
MaxDocuments,
MaxDocumentBytes,
OutboundRequestTimeout,
HandlerTimeout,
}
impl fmt::Display for ResourcePolicyField {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
formatter.write_str(match self {
Self::MaxInboundRequests => "max_inbound_requests",
Self::MaxOutboundMessages => "max_outbound_messages",
Self::MaxOutboundBytes => "max_outbound_bytes",
Self::MaxDocuments => "max_documents",
Self::MaxDocumentBytes => "max_document_bytes",
Self::OutboundRequestTimeout => "outbound_request_timeout",
Self::HandlerTimeout => "handler_timeout",
})
}
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct ResourcePolicy {
pub max_inbound_requests: usize,
pub max_outbound_messages: usize,
pub max_outbound_bytes: usize,
pub max_documents: usize,
pub max_document_bytes: usize,
pub outbound_request_timeout: Option<Duration>,
pub handler_timeout: Duration,
}
impl ResourcePolicy {
pub(crate) fn validate(self) -> Result<(), BuildError> {
for (field, value) in [
(
ResourcePolicyField::MaxInboundRequests,
self.max_inbound_requests,
),
(
ResourcePolicyField::MaxOutboundMessages,
self.max_outbound_messages,
),
(
ResourcePolicyField::MaxOutboundBytes,
self.max_outbound_bytes,
),
(ResourcePolicyField::MaxDocuments, self.max_documents),
(
ResourcePolicyField::MaxDocumentBytes,
self.max_document_bytes,
),
] {
if value == 0 {
return Err(BuildError::InvalidResourcePolicy { field });
}
}
if self.outbound_request_timeout == Some(Duration::ZERO) {
return Err(BuildError::InvalidResourcePolicy {
field: ResourcePolicyField::OutboundRequestTimeout,
});
}
if self.handler_timeout == Duration::ZERO {
return Err(BuildError::InvalidResourcePolicy {
field: ResourcePolicyField::HandlerTimeout,
});
}
Ok(())
}
}
impl Default for ResourcePolicy {
fn default() -> Self {
Self {
max_inbound_requests: 64,
max_outbound_messages: 1_024,
max_outbound_bytes: 16 * 1024 * 1024,
max_documents: 1_024,
max_document_bytes: 64 * 1024 * 1024,
outbound_request_timeout: Some(Duration::from_secs(30)),
handler_timeout: Duration::from_secs(30),
}
}
}