pub const MCP_COMMENT_BODY_MAX: usize = 32 * 1024;
pub const MCP_REPLY_BODY_MAX: usize = 16 * 1024;
pub const MCP_REVIEW_BODY_MAX: usize = 32 * 1024;
pub const MCP_GENERATED_TEST_BODY_MAX: usize = 256 * 1024;
#[must_use]
pub fn check_body_size(name: &str, body: &str, limit: usize) -> Option<String> {
let actual = body.len();
if actual > limit {
Some(format!(
"Input exceeds {name} size limit: {limit} bytes (got {actual})"
))
} else {
None
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn check_body_size_accepts_exactly_at_limit() {
let body = "x".repeat(MCP_COMMENT_BODY_MAX);
assert!(check_body_size("comment body", &body, MCP_COMMENT_BODY_MAX).is_none());
}
#[test]
fn check_body_size_rejects_one_byte_over() {
let body = "x".repeat(MCP_COMMENT_BODY_MAX + 1);
let msg = check_body_size("comment body", &body, MCP_COMMENT_BODY_MAX)
.expect("one byte over must be rejected");
assert!(msg.contains("comment body"));
assert!(msg.contains(&MCP_COMMENT_BODY_MAX.to_string()));
assert!(msg.contains(&(MCP_COMMENT_BODY_MAX + 1).to_string()));
}
#[test]
fn check_body_size_accepts_empty_body() {
assert!(check_body_size("whatever", "", MCP_COMMENT_BODY_MAX).is_none());
}
#[test]
fn limits_have_expected_values() {
assert_eq!(MCP_COMMENT_BODY_MAX, 32 * 1024);
assert_eq!(MCP_REPLY_BODY_MAX, 16 * 1024);
assert_eq!(MCP_REVIEW_BODY_MAX, 32 * 1024);
assert_eq!(MCP_GENERATED_TEST_BODY_MAX, 256 * 1024);
}
}