#[derive(Debug, Clone, Copy)]
pub struct BodyLimit {
kind: Option<BodyLimitKind>,
}
#[derive(Debug, Clone, Copy)]
enum BodyLimitKind {
Bidirectional(usize, usize),
Request(usize),
Response(usize),
}
impl BodyLimit {
pub fn request_only(limit: usize) -> Self {
Self {
kind: if limit == 0 {
None
} else {
Some(BodyLimitKind::Request(limit))
},
}
}
pub fn response_only(limit: usize) -> Self {
Self {
kind: if limit == 0 {
None
} else {
Some(BodyLimitKind::Response(limit))
},
}
}
pub fn symmetric(limit: usize) -> Self {
Self {
kind: if limit == 0 {
None
} else {
Some(BodyLimitKind::Bidirectional(limit, limit))
},
}
}
pub fn asymmetric(request: usize, response: usize) -> Self {
match (request, response) {
(0, 0) => Self { kind: None },
(0, response) => Self {
kind: Some(BodyLimitKind::Response(response)),
},
(request, 0) => Self {
kind: Some(BodyLimitKind::Request(request)),
},
(request, response) => Self {
kind: Some(BodyLimitKind::Bidirectional(request, response)),
},
}
}
pub fn request(&self) -> Option<usize> {
match self.kind {
Some(BodyLimitKind::Request(limit)) => Some(limit),
Some(BodyLimitKind::Bidirectional(request, _)) => Some(request),
_ => None,
}
}
pub fn response(&self) -> Option<usize> {
match self.kind {
Some(BodyLimitKind::Response(limit)) => Some(limit),
Some(BodyLimitKind::Bidirectional(_, response)) => Some(response),
_ => None,
}
}
}